大数据WEB阶段 shiro安全控制框架
生活随笔
收集整理的這篇文章主要介紹了
大数据WEB阶段 shiro安全控制框架
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
shiro安全框架
零、目錄
- 問題引申
- shiro介紹
- shiro工作流程
- 使用shiro 進(jìn)行登錄操作
- 使用shiro進(jìn)行權(quán)限管理
一、 問題引申
二、 shiro安全框架介紹
三、工作流程
四、使用shiro進(jìn)行登錄操作
導(dǎo)入需要依賴的jar包
<!-- Apache Shiro 權(quán)限架構(gòu) --> <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-all</artifactId><version>1.2.3</version> </dependency>創(chuàng)建shiro的配置文件 一共5個(gè)bean
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:util="http://www.springframework.org/schema/util"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"><!--1. 安全管理器 --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!-- 注入原材料 --><property name="realm" ref="authRealm"></property></bean><!-- 2. 創(chuàng)建原材料 com.tj.ht.shiro.AuthRleam類--><!-- 3. 引入原材料 --><bean id="authRealm" class="com.tj.ht.shiro.AuthRealm"><!-- 注入加密匹配器 --><property name="credentialsMatcher" ref="authMatcher"></property></bean> <!-- 4. 創(chuàng)建加密匹配器 com.tj.ht.shiro.AuthMatcher類--><!-- 5. 引入加密匹配器 --><bean id="authMatcher" class="com.tj.ht.shiro.AuthMatcher"></bean><!-- 6. 權(quán)限認(rèn)證 的觀察器 --><bean id="advisor" class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><!-- 注入安全管理器 --><property name="securityManager" ref="securityManager"></property></bean><!-- 7. shiro過濾工廠 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" ><!-- 輸入安全管理器 --><property name="securityManager" ref="securityManager"></property><!-- 配置登陸地址 如果沒有登陸則跳轉(zhuǎn)發(fā)出登陸請(qǐng)求 , 跳轉(zhuǎn)到登陸界面 默認(rèn)是放行的--><property name="loginUrl" value="/tologin.action"></property><!-- 配置攔截 和 放行地址 --><property name="filterChainDefinitions"><value><!-- anon 放行 --><!-- authc 攔截 -->/login.action=anon <!-- 對(duì)登陸放行 --><!-- /* 代表 所有請(qǐng)求 --><!-- /**代表所有請(qǐng)求及靜態(tài)資源文件 -->/staticfile/**=anon <!-- 對(duì)靜態(tài)資源放行 -->/sysadmin/user/tocreate=anon<!-- 對(duì)添加用戶放行 測(cè)試用 -->/sysadmin/user/save=anon<!-- 對(duì)添加用戶放行 測(cè)試用-->/**=authc<!-- 除了上面放行的資源 , 其余全部攔截 --></value></property></bean></beans>在web.xml文件中配置過濾器
<!-- 配置安全框架過濾器 --><filter><filter-name>shiroFilter</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><init-param><!-- 吧過濾器的生命周期交給web容器進(jìn)行管理 --><param-name>targetFilterLifecycle</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>shiroFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>執(zhí)行流程
安全管理器進(jìn)行登錄檢驗(yàn)時(shí)需要先把用戶輸入的明文密碼加密后再與數(shù)據(jù)庫中加密后的面比對(duì) ,這是會(huì)去找自定義的AuthCredentialMatcher
1. 攔截登錄請(qǐng)求 @RequestMapping("login.action") public String login(Model model , String username , String password ) {//獲取subject對(duì)象Subject subject = SecurityUtils.getSubject();//創(chuàng)建用戶名密碼令牌UsernamePasswordToken token = new UsernamePasswordToken(username , password);try{//安全框架進(jìn)行登陸subject.login(token);//得到登錄成功的信息User u = (User) subject.getPrincipal();model.addAttribute("_CURRENT_USER", u);//把用戶信息存進(jìn)session中}catch(AuthenticationException e) {e.printStackTrace();//登錄失敗model.addAttribute("errorInfo", "用戶名或密碼錯(cuò)誤!");return "sysadmin/login/login";}//登錄成功return "redirect:/home"; } 2. AuthRealm類 public class AuthRealm extends SimpleAccountRealm{@Autowiredprivate UserService userService;//登錄證明@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//需要給安全中i性能提供的登陸校驗(yàn)的信息 1. 用戶正確信息 2. 提交的信息//得到正確信息//用戶輸入的信息UsernamePasswordToken myToken = (UsernamePasswordToken) token;//通過提交的用戶名查詢用戶正確信息User user = userService.findOneByUsername(myToken.getUsername());//創(chuàng)建用于登陸的原材料信息//參數(shù) 1. 正確信息 2. 需要驗(yàn)證的正確信息 3. 原材料的類的名稱AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());return info;}//權(quán)限認(rèn)證@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {// TODO Auto-generated method stubreturn super.doGetAuthorizationInfo(principals);}} 3. AuthMatcher類 public class AuthMatcher extends SimpleCredentialsMatcher{//需要在此位置對(duì)原材料中的密碼進(jìn)行加密操作@Overridepublic boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {//得到明文密碼 加密后設(shè)置回去UsernamePasswordToken myToken = (UsernamePasswordToken) token;Md5Hash md5Hash = new Md5Hash(String.valueOf(myToken.getPassword()) , myToken.getUsername(), 3);//設(shè)置回去myToken.setPassword(md5Hash.toString().toCharArray());return super.doCredentialsMatch(myToken, info);}} 4. 登出操作 @RequestMapping("logout") public String logout(Model model,HttpSession session) {session.removeAttribute("_CURRENT_USER");//通知shiro框架 退出登錄Subject subject = SecurityUtils.getSubject();//判斷是否是登錄狀態(tài) , 如果是則退出if(subject.isAuthenticated()) {subject.logout();}return "sysadmin/login/login"; }五、通過shiro實(shí)現(xiàn)權(quán)限管理
代碼
1. 正原材料類中添加權(quán)限認(rèn)證代碼 public class AuthRealm extends SimpleAccountRealm{@Autowiredprivate UserService userService;//登錄證明@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//需要給安全中i性能提供的登陸校驗(yàn)的信息 1. 用戶正確信息 2. 提交的信息//得到正確信息//用戶輸入的信息UsernamePasswordToken myToken = (UsernamePasswordToken) token;//通過提交的用戶名查詢用戶正確信息User user = userService.findOneByUsername(myToken.getUsername());//創(chuàng)建用于登陸的原材料信息//參數(shù) 1. 正確信息 2. 需要驗(yàn)證的正確信息 3. 原材料的類的名稱AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());return info;}//權(quán)限認(rèn)證@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {User user = (User) principals.getPrimaryPrincipal();List<String> ps = userService.findAllModulesByUserId(user.getUserId());SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();info.addRoles(ps);return info;}} 2. 在頁面中引入標(biāo)簽 <%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro" %> 3. 對(duì)頁面中的模塊請(qǐng)求進(jìn)行控制 <shiro:hasPermission name="貨運(yùn)管理"> //name要與原材料中l(wèi)ist中的權(quán)限一致<span id="topmenu" onclick="toModule('cargo');">貨運(yùn)管理</span><span id="tm_separator"></span> </shiro:hasPermission> <shiro:hasPermission name="基礎(chǔ)信息"> <span id="topmenu" onclick="toModule('baseinfo');">基礎(chǔ)信息</span><span id="tm_separator"></span></shiro:hasPermission><shiro:hasPermission name="系統(tǒng)管理"> <span id="topmenu" onclick="toModule('sysadmin');">系統(tǒng)管理</span></shiro:hasPermission>總結(jié)
以上是生活随笔為你收集整理的大数据WEB阶段 shiro安全控制框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据WEB阶段 Servlet配置优先
- 下一篇: 大数据 互联网架构阶段 电商项目简介