天天看点

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】如果前后端分离呢?