【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下載下傳。