shiro之記住登錄信息
Shiro提供了記住我(RememberMe)的功能,比如訪問如淘寶等一些網(wǎng)站時,關(guān)閉了瀏覽器下次再打開時還是能記住你是誰,下次訪問時無需再登錄即可訪問,基本流程如下:
1、首先在登錄頁面選中RememberMe然后登錄成功;如果是瀏覽器登錄,一般會把RememberMe的Cookie寫到客戶端并保存下來;
2、關(guān)閉瀏覽器再重新打開;會發(fā)現(xiàn)瀏覽器還是記住你的;
3、訪問一般的網(wǎng)頁服務(wù)器端還是知道你是誰,且能正常訪問;
4、但是比如我們訪問淘寶時,如果要查看我的訂單或進行支付時,此時還是需要再進行身份認證的,以確保當(dāng)前用戶還是你。
RememberMe配置
spring-shiro-web.xml配置:
Java代碼
<!-- 會話Cookie模板 --> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <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表示瀏覽器關(guān)閉時失效此Cookie;
rememberMeCookie:即記住我的Cookie,保存時長30天;
Java代碼
<!-- 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算法;
Java代碼
<!-- 安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> …… <property name="rememberMeManager" ref="rememberMeManager"/> </bean>
設(shè)置securityManager安全管理器的rememberMeManager;
Java代碼
<bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter"> …… <property name="rememberMeParam" value="rememberMe"/> </bean>
rememberMeParam,即rememberMe請求參數(shù)名,請求參數(shù)是boolean類型,true表示rememberMe。
Java代碼
<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登錄的都可以。
測試:
1、訪問http://localhost:8080/chapter13/,會跳轉(zhuǎn)到登錄頁面,登錄成功后會設(shè)置會話及rememberMe Cookie;
2、關(guān)閉瀏覽器,此時會話cookie將失效;
3、然后重新打開瀏覽器訪問http://localhost:8080/chapter13/,還是可以訪問的;
4、如果此時訪問http://localhost:8080/chapter13/authenticated.jsp,會跳轉(zhuǎn)到登錄頁面重新進行身份驗證。
如果要自己做RememeberMe,需要在登錄之前這樣創(chuàng)建Token:UsernamePasswordToken(用戶名,密碼,是否記住我),如:
Java代碼
Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); token.setRememberMe(true); subject.login(token);
subject.isAuthenticated()表示用戶進行了身份驗證登錄的,即使有Subject.login進行了登錄;subject.isRemembered():表示用戶是通過記住我登錄的,此時可能并不是真正的你(如你的朋友使用你的電腦,或者你的cookie被竊?。┰谠L問的;且兩者二選一,即subject.isAuthenticated()==true,則subject.isRemembered()==false;反之一樣。
另外對于過濾器,一般這樣使用:
訪問一般網(wǎng)頁,如個人在主頁之類的,我們使用user攔截器即可,user攔截器只要用戶登錄(isRemembered()==true or isAuthenticated()==true)過即可訪問成功;
訪問特殊網(wǎng)頁,如我的訂單,提交訂單頁面,我們使用authc攔截器即可,authc攔截器會判斷用戶是否是通過Subject.login(isAuthenticated()==true)登錄的,如果是才放行,否則會跳轉(zhuǎn)到登錄頁面叫你重新登錄。
因此RememberMe使用過程中,需要配合相應(yīng)的攔截器來實現(xiàn)相應(yīng)的功能,用錯了攔截器可能就不能滿足你的需求了。
總結(jié)
以上所述是小編給大家介紹的shiro之記住登錄信息,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- spring boot 集成 shiro 自定義密碼驗證 自定義freemarker標(biāo)簽根據(jù)權(quán)限渲染不同頁面(推薦
- Java中SSM+Shiro系統(tǒng)登錄驗證碼的實現(xiàn)方法
- Java中基于Shiro,JWT實現(xiàn)微信小程序登錄完整例子及實現(xiàn)過程
- spring boot整合Shiro實現(xiàn)單點登錄的示例代碼
- springmvc+shiro+maven 實現(xiàn)登錄認證與權(quán)限授權(quán)管理
- 關(guān)于Apache shiro實現(xiàn)一個賬戶同一時刻只有一個人登錄(shiro 單點登錄)
- Shiro 控制并發(fā)登錄人數(shù)限制及登錄踢出的實現(xiàn)代碼
- shiro多驗證登錄代碼實例及問題解決
相關(guān)文章
Intellij Idea修改代碼方法參數(shù)自動提示快捷鍵的操作
這篇文章主要介紹了Intellij Idea修改代碼方法參數(shù)自動提示快捷鍵的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01淺析JAVA中的內(nèi)存結(jié)構(gòu)、重載、this與繼承
這篇文章主要介紹了 JAVA中的內(nèi)存結(jié)構(gòu)、重載、this與繼承的相關(guān)資料,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03