簡單兩步快速實現shiro的配置和使用,包含登陸驗證、角色驗證、權限驗證以及shiro登陸註銷流程(基於spring的方式,使用maven構建)

前言:html

shiro由於其簡單、可靠、實現方便而成爲如今最經常使用的安全框架,那麼這篇文章除了會用簡潔明瞭的方式講一下基於spring的shiro詳細配置和登陸註銷功能使用以外,也會根據慣例在文章最後總結一下shiro的大體配置使用流程,但願本篇文章可以後能給你們一種原來shiro這麼簡單的錯覺感受。java

注意:該篇文章的開始是創建在一個完備的spring+mybatis的開發環境中,除了shiro以外的配置基本不會涉及到。作好本身--eguid原創文章web

1、依賴的jar包

本篇文章使用shiro-1.4.0版本spring

一、shiro官方下載地址:http://shiro.apache.org/download.htmlapache

二、maven依賴項:數組

 

[html]  view plain  copy
 
 print?
  1. <dependency>  
  2.     <groupId>org.apache.shiro</groupId>  
  3.     <artifactId>shiro-spring</artifactId>  
  4.     <version>1.4.0</version>  
  5. </dependency>  


爲何maven只須要shiro-spring這個依賴項就好了,由於shiro-spring依賴shiro-core和shiro-web兩個包,因此會自動繼承shiro-core和shiro-web以及這兩個包所依賴的項。安全

 

2、基於spring的配置方式

一、配置shiro過濾器

 

[html]  view plain  copy
 
 print?
  1. <!-- shiro過濾器 -->  
  2.     <filter>  
  3.         <filter-name>shiroFilter</filter-name>  
  4.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  5.         <init-param>  
  6.             <param-name>targetFilterLifecycle</param-name>  
  7.             <param-value>true</param-value>  
  8.         </init-param>  
  9.     </filter>  
  10.     <filter-mapping>  
  11.         <filter-name>shiroFilter</filter-name>  
  12.         <url-pattern>/*</url-pattern>  
  13.     </filter-mapping>  



 

二、基於spring的shiro配置

 

注意事項:spring在加載上下文的時候,是沒有掃描註解的,因爲咱們在自定義的realm中用到了spring的註解,因此須要在shiro的自定義realm以前進行註解掃描。session

<context:component-scan base-package="cc.eguid" />mybatis

(1)spring下的shiro完整配置

 

[html]  view plain  copy
 
 print?
  1. <!-- shiro的生命週期處理器 -->  
  2.     <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />  
  3.   
  4.     <!-- 使用shiro安全檢查註解 -->  
  5.     <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor" />  
  6.     <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">  
  7.         <property name="securityManager" ref="securityManager" />  
  8.     </bean>  
  9.       
  10.     <!-- 自定義的安全數據源,用來實現自定義的登陸驗證、角色驗證、權限驗證 -->  
  11.     <bean id="myRealm" class="cc.eguid.shiro.MyRealm"/>  
  12.     <!-- 安全管理器 -->  
  13.     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  14.         <property name="realm" ref="myRealm" />  
  15.     </bean>  
  16.     <!-- shiro過濾器 -->  
  17.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  18.         <!-- 配置安全管理器 -->  
  19.         <property name="securityManager" ref="securityManager" />  
  20.         <!-- 身份認證失敗跳轉的地址,沒有登陸固然就跳轉到登陸地址 -->  
  21.         <property name="loginUrl" value="/login/" />  
  22.         <!-- 身份認證成功跳轉的地址,通常登陸成功後會跳轉到系統首頁 -->  
  23.         <property name="successUrl" value="/" />  
  24.         <!-- 權限認證失敗跳轉的地址 ,用來提示當前用戶沒有操做權限,能夠不須要-->  
  25.         <property name="unauthorizedUrl" value="/login/unauthorized" />  
  26.         <property name="filterChainDefinitions">  
  27.             <!--anon 表示匿名訪問,不須要認證以及受權 -->  
  28.             <!--authc表示須要認證 沒有進行身份認證是不能進行訪問的 -->  
  29.             <!--authc,roles[admin]表示是admin角色的用戶才能訪問 -->  
  30.             <value>  
  31.                 /* = authc  
  32.                 /static/** =anon  
  33.                 /login/** = anon  
  34.                 /admin/** = authc,roles[admin]  
  35.                 /camera/** = authc  
  36.                 /** = authc  
  37.             </value>  
  38.         </property>  
  39.     </bean>  


這段配置須要修改的只有shiro過濾器和shiro安全數據源(realm)。app

 

過濾器裏能夠配置註釋裏寫的很清楚,anon表示匿名訪問,authc表示須要進行登陸驗證、權限驗證、角色驗證

自定義realm實現請看下面。

(2)自定義的realm安全數據源

 

[java]  view plain  copy
 
 print?
  1. public class MyRealm extends AuthorizingRealm{  
  2.     Logger log=Logger.getLogger(MyRealm.class);  
  3.       
  4.     @Autowired  
  5.     private UserService userService;//這是本身實現的用戶信息操做類,實現用戶信息,用戶角色信息、用戶權限信息查詢功能  
  6.   
  7.     @Override  
  8.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
  9.         log.info("從登陸憑證中獲取用戶信息,因爲咱們在doGetAuthenticationInfo中直接在principals中存放的用戶信息對象,因此咱們能夠得到當前用戶信息");  
  10.         UserInfo user = (UserInfo) principals.getPrimaryPrincipal();  
  11.         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();  
  12.         // 查詢角色信息  
  13.         Collection<String> roles = userService.findRoles(user);  
  14.         log.info("查詢用戶角色信息並添加到shiro權限驗證器中,一個用戶能夠對應多個角色");  
  15.         info.addRoles(roles);  
  16.         // 查詢權限信息  
  17.         Collection<String> permissions = userService.findPermissions(user);  
  18.         log.info("把用戶權限信息添加到shiro權限過濾器中");  
  19.         info.addStringPermissions(permissions);  
  20.         return info;  
  21.     }  
  22.   
  23.     @Override  
  24.     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)throws AuthenticationException{  
  25.         log.info("shiro登陸驗證");  
  26.         // 在咱們本身的登陸流程中應該確保登陸的用戶信息已經插入AuthenticationToken中,這樣才能經過shiro的認證流程  
  27.         String loginname= token.getPrincipal().toString();  
  28.         //雖然在登陸流程中咱們給的是String的面,可是shiro中已經寫死了密碼是個字符數組,因此老老實實的把密碼轉成char[]吧  
  29.         char[] password=(char[]) token.getCredentials();  
  30.         // 查詢用戶名對應的用戶信息  
  31.         UserInfo user =userService.queryUserInfoByLoginName(loginname);  
  32.         log.info("驗證用戶信息:"+loginname+","+user+"密碼:"+password);  
  33.         if (user != null&&user.getPassword()!=null) {  
  34.             //直接把用戶信息對象和密碼塞進shiro驗證器,shiro會自動判斷密碼是否正確  
  35.             AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, password, getName());  
  36.             return authenticationInfo;  
  37.         }  
  38.         return null;  
  39.     }  



 

3、shiro登陸和註銷流程實現

 

[java]  view plain  copy
 
 print?
  1. /** 
  2.      * shiro註銷,shiro會自動把session釋放,因此不須要調用session.invalidate();方法 
  3.      */  
  4.     @Override  
  5.     public void logout(){  
  6.         Subject currentUser = SecurityUtils.getSubject();         
  7.         <span style="white-space:pre">  </span>currentUser.logout();  
  8.         
  9.     }  
  10.     /** 
  11.      * shiro登陸 
  12.      */  
  13.     @Override  
  14.     public boolean singin(UserInfo user){  
  15.         try{  
  16.             Subject subject = SecurityUtils.getSubject() ;  
  17.             <span style="white-space:pre">  </span>UsernamePasswordToken token = new UsernamePasswordToken(user.getLoginusername(),user.getPassword()) ;  
  18.             subject.login(token);  
  19.             log.info("shiro登陸驗證成功");  
  20.             return true;  
  21.         }catch(AuthenticationException e){  
  22.             log.error("shiro登陸驗證不經過",e);  
  23.             return false;  
  24.         }  
  25.     }  
  26.   
  27.     /** 
  28.      * 判斷用戶是否登陸(shiro方式) 
  29.      */  
  30.     @Override  
  31.     public boolean isSignon() {  
  32.         Subject subject = SecurityUtils.getSubject() ;  
  33.         return subject.isAuthenticated();  
  34.     }  

 

 

 

4、shiro配置使用總結

一、在web.xml中配置shiro的過濾器

二、在spring應用上下文(例如:applicationContext.xml)中配置shiro過濾器及自定義realm等其餘輔助配置,其中

shiro過濾器能夠配置哪些接口須要進行登陸驗證、角色驗證、權限驗證,哪些不須要進行驗證,自定義realm則是爲shiro驗證器提供了用戶信息、用戶角色信息和用戶權限信息等數據源,進而讓shiro進行三項驗證。

三、shiro提供了完整的登陸流程和註銷流程,對原有登陸和註銷流程作必定修改是免不了的。

以上,但願對你們有所幫助。-- 作好本身--eguid

相關文章
相關標籤/搜索