天天看點

Shiro - RememberMe記住我功能實作

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

【3】如果前後端分離呢?