目錄貼: 跟我學Shiro目錄貼git
Shiro提供了記住我(RememberMe)的功能,好比訪問如淘寶等一些網站時,關閉了瀏覽器下次再打開時仍是能記住你是誰,下次訪問時無需再登陸便可訪問,基本流程以下:github
一、首先在登陸頁面選中RememberMe而後登陸成功;若是是瀏覽器登陸,通常會把RememberMe的Cookie寫到客戶端並保存下來;web
二、關閉瀏覽器再從新打開;會發現瀏覽器仍是記住你的;算法
三、訪問通常的網頁服務器端仍是知道你是誰,且能正常訪問;spring
四、可是好比咱們訪問淘寶時,若是要查看個人訂單或進行支付時,此時仍是須要再進行身份認證的,以確保當前用戶仍是你。apache
spring-shiro-web.xml配置:瀏覽器
<!-- 會話Cookie模板 --> 服務器
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> cookie
<constructor-arg value="sid"/>
<property name="httpOnly" value="true"/>
<property name="maxAge" value="-1"/>
</bean>
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="rememberMe"/>
<property name="httpOnly" value="true"/>
<property name="maxAge" value="2592000"/><!-- 30天 -->
</bean>
sessionIdCookie:maxAge=-1表示瀏覽器關閉時失效此Cookie;
rememberMeCookie:即記住個人Cookie,保存時長30天;
<!-- rememberMe管理器 -->
<bean id="rememberMeManager"
class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cipherKey" value="
#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>
<property name="cookie" ref="rememberMeCookie"/>
</bean>
rememberMe管理器,cipherKey是加密rememberMe Cookie的密鑰;默認AES算法;
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
……
<property name="rememberMeManager" ref="rememberMeManager"/>
</bean>
設置securityManager安全管理器的rememberMeManager;
<bean id="formAuthenticationFilter"
class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
……
<property name="rememberMeParam" value="rememberMe"/>
</bean>
rememberMeParam,即rememberMe請求參數名,請求參數是boolean類型,true表示rememberMe。
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
……
<property name="filterChainDefinitions">
<value>
/login.jsp = authc
/logout = logout
/authenticated.jsp = authc
/** = user
</value>
</property>
</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(用戶名,密碼,是否記住我),如:
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true);
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技術。