Shiro - RememberMe記住我功能實現
阿新 • • 發佈:2018-11-14
【1】認證和記住我
① 記住我
Shiro提供了記住我(RememberMe)的功能,比如訪問如淘寶等一些網站時,關閉了瀏覽器,下次再開啟時還是能記住你是誰,下次訪問時無需再登入即可訪問,基本流程如下:
- 首先在登入頁面選中RememberMe然後登入成功;如果是瀏覽器登入,一般會把RememberMe的Cookie 寫到客戶端並儲存下來;
- 關閉瀏覽器再重新開啟;會發現瀏覽器還是記住你的;
- 訪問一般的網頁伺服器端還是知道你是誰,且能正常訪問;
- 但是比如我們訪問淘寶時,如果要檢視我的訂單或進行支付時,此時還是需要再進行身份認證的,以確保當前使用者還是你。
② 認證
subject.isAuthenticated() 表示使用者進行了身份驗證登入的,即使用Subject.login進行了登入。
subject.isRemembered()表示使用者是通過記住我登入的,此時可能並不是真正的你(如你的朋友使用你的電腦,或者你的cookie 被竊取)在訪問的。
③ 建議
訪問一般網頁:如個人在主頁之類的,我們使用user 攔截器即可,user 攔截器只要使用者登入(isRemembered() || isAuthenticated()
)過即可訪問成功。
訪問特殊網頁:如我的訂單,提交訂單頁面,我們使用authc攔截器即可,authc攔截器會判斷使用者是否是通過Subject.login(isAuthenticated()==true)
【2】實現記住我功能
如果要自己做RememeberMe,程式碼例項如下:
UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
token.setRememberMe(true);
XML配置如下:
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg value="rememberMe"/> <property name="httpOnly" value="true"/> <!-- 30天--> <property name="maxAge" value="2592000"/> </bean> <!-- 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> <!-- 安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- 注入快取管理器 --> <property name="cacheManager" ref="cacheManager"/> <property name="authenticator" ref="authenticator" /> <property name="realms"> <list> <ref bean="customRealm"/> </list> </property> <property name="sessionManager" ref="sessionManager" /> <property name="rememberMeManager" ref="rememberMeManager" /> </bean>
你可能需要在登入頁面新增一個記住我複選框,根據該複選框的狀態在後臺判斷是否設定token.setRememberMe(true);
。
Shiro完整配置與專案地址:GitHub-Shiro下載。