第十三章 RememberMe——《跟我學Shiro》

目錄貼: 跟我學Shiro目錄貼git

 

Shiro提供了記住我(RememberMe)的功能,好比訪問如淘寶等一些網站時,關閉了瀏覽器下次再打開時仍是能記住你是誰,下次訪問時無需再登陸便可訪問,基本流程以下:github

一、首先在登陸頁面選中RememberMe而後登陸成功;若是是瀏覽器登陸,通常會把RememberMe的Cookie寫到客戶端並保存下來;web

二、關閉瀏覽器再從新打開;會發現瀏覽器仍是記住你的;算法

三、訪問通常的網頁服務器端仍是知道你是誰,且能正常訪問;spring

 

四、可是好比咱們訪問淘寶時,若是要查看個人訂單或進行支付時,此時仍是須要再進行身份認證的,以確保當前用戶仍是你。apache

RememberMe配置

 

spring-shiro-web.xml配置:瀏覽器

Java代碼  收藏代碼安全

  1. <!-- 會話Cookie模板 -->  服務器

  2. <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  cookie

  3.     <constructor-arg value="sid"/>  

  4.     <property name="httpOnly" value="true"/>  

  5.     <property name="maxAge" value="-1"/>  

  6. </bean>  

  7. <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  

  8.     <constructor-arg value="rememberMe"/>  

  9.     <property name="httpOnly" value="true"/>  

  10.     <property name="maxAge" value="2592000"/><!-- 30天 -->  

  11. </bean>   

sessionIdCookie:maxAge=-1表示瀏覽器關閉時失效此Cookie;

rememberMeCookie:即記住個人Cookie,保存時長30天;

  

Java代碼  收藏代碼

  1. <!-- rememberMe管理器 -->  

  2. <bean id="rememberMeManager"   

  3. class="org.apache.shiro.web.mgt.CookieRememberMeManager">  

  4.     <property name="cipherKey" value="  

  5. #{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>  

  6.      <property name="cookie" ref="rememberMeCookie"/>  

  7. </bean>   

rememberMe管理器,cipherKey是加密rememberMe Cookie的密鑰;默認AES算法;

 

Java代碼  收藏代碼

  1. <!-- 安全管理器 -->  

  2. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  

  3. ……  

  4.     <property name="rememberMeManager" ref="rememberMeManager"/>  

  5. </bean>   

設置securityManager安全管理器的rememberMeManager; 

 

Java代碼  收藏代碼

  1. <bean id="formAuthenticationFilter"   

  2. class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">  

  3.     ……  

  4.     <property name="rememberMeParam" value="rememberMe"/>  

  5. </bean>   

rememberMeParam,即rememberMe請求參數名,請求參數是boolean類型,true表示rememberMe。 

 

Java代碼  收藏代碼

  1. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  

  2.     ……  

  3.     <property name="filterChainDefinitions">  

  4.         <value>  

  5.             /login.jsp = authc  

  6.             /logout = logout  

  7.             /authenticated.jsp = authc  

  8.             /** = user  

  9.         </value>  

  10.     </property>  

  11. </bean>   

「/authenticated.jsp = authc」表示訪問該地址用戶必須身份驗證經過(Subject. isAuthenticated()==true);而「/** = user」表示訪問該地址的用戶是身份驗證經過或RememberMe登陸的均可以。

 

測試:

一、訪問http://localhost:8080/chapter13/,會跳轉到登陸頁面,登陸成功後會設置會話及rememberMe Cookie;

二、關閉瀏覽器,此時會話cookie將失效;

三、而後從新打開瀏覽器訪問http://localhost:8080/chapter13/,仍是能夠訪問的;

四、若是此時訪問http://localhost:8080/chapter13/authenticated.jsp,會跳轉到登陸頁面從新進行身份驗證。

 

若是要本身作RememeberMe,須要在登陸以前這樣建立Token:UsernamePasswordToken(用戶名,密碼,是否記住我),如:

Java代碼  收藏代碼

  1. Subject subject = SecurityUtils.getSubject();  

  2. UsernamePasswordToken token = new UsernamePasswordToken(username, password);  

  3. token.setRememberMe(true);  

  4. subject.login(token);   

subject.isAuthenticated()表示用戶進行了身份驗證登陸的,即便有 Subject.login進行了登陸;subject.isRemembered():表示用戶是經過記住我登陸的,此時可能並非真正的你(如你的朋 友使用你的電腦,或者你的cookie被竊取)在訪問的;且二者二選一,即subject.isAuthenticated()==true,則 subject.isRemembered()==false;反之同樣。

 

另外對於過濾器,通常這樣使用:

訪問通常網頁,如我的在主頁之類的,咱們使用user攔截器便可,user攔截器只要用戶登陸(isRemembered()==true or isAuthenticated()==true)過便可訪問成功;

訪問特殊網頁,如個人訂單,提交訂單頁面,咱們使用authc攔截器便可,authc攔截器會判斷用戶是不是經過Subject.login(isAuthenticated()==true)登陸的,若是是才放行,不然會跳轉到登陸頁面叫你從新登陸。

 

所以RememberMe使用過程當中,須要配合相應的攔截器來實現相應的功能,用錯了攔截器可能就不能知足你的需求了。

 

示例源代碼:https://github.com/zhangkaitao/shiro-example;可加羣 231889722 探討Spring/Shiro技術。

相關文章
相關標籤/搜索