实现shiro-remember功能

1 篇文章 0 订阅
1 篇文章 0 订阅

首先说一下rememberMe是什么,
通俗的说就是 你登录百度以后,选择记住我,关闭浏览器之后打开百度,发现你还是登录状态,这样就是RememberMe
在这里,我们假设已经实现了shiro的基本登录功能。
首先是页面

userName<input type="text"id="userName" name="userName"value="<shiro:principal/>" /><br/>
password:<input type="text" id="password" name="password" value="${user.password}"/><br/>
下次自动登录:<inputtype="checkbox"id="rememberMe"name="rememberMe" value="true"/><br/>
<input type="button" id="login"  value="login"/><font color="red"/><font>${error}</font>

再其次 需要配置Spring-shiro.xml

<!-- 会话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表示浏览器关闭时失效此Cookie;
rememberMeCookie:即记住我的Cookie,保存时长30天;

<!-- 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算法;

<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="rememberMeManager" ref="rememberMeManager"/>
<property name="realm" ref="myRealm"/>  
</bean>  

设置securityManager安全管理器的rememberMeManager;securityManager可以实现自己的relam

<!-- 基于Form表单的身份验证过滤器 -->
<bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
        <property name="usernameParam" value="userName"/>
        <property name="passwordParam" value="password"/>
        <property name="rememberMeParam" value="rememberMe"/>
        <property name="loginUrl" value="/login"/>
</bean>

在html里定义,rememberMeParam,即rememberMe请求参数名,请求参数是boolean类型,true表示rememberMe。默认是false

    <!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 -->
    <!-- Shiro过滤器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
        <!-- Shiro的核心安全接口,这个属性是必须的 -->  
        <property name="securityManager" ref="securityManager"/>
        <!-- 身份认证失败,则跳转到登录页面的配置 -->  
        <property name="loginUrl" value="login"/>
        <!-- 权限认证失败,则跳转到指定页面 -->  
        <property name="unauthorizedUrl" value="unauthorizedUrl"/>  
        <!-- Shiro连接约束配置,即过滤链的定义 -->  
        <property name="filterChainDefinitions">  
            <value>  
                 /login=anon
                 /index=anon
                 /main=user
                 /left=user
                 /userMange=authc
                 /js/commom/*.*=anon
            </value>  
        </property>
    </bean> 

“/userMange= authc”表示访问该地址用户必须身份验证通过(Subject. isAuthenticated()==true);而“/main = user”表示访问该地址的用户是身份验证通过或RememberMe登录的都可以。/login=anon表示所有人都能访问

            Subject subject  = SecurityUtils.getSubject();
            // 用户输入的账号和密码,,存到UsernamePasswordToken对象中..然后由shiro内部认证对比,
            // 认证执行者交由ShiroDbRealm中doGetAuthenticationInfo处理
            // 当以上认证成功后会向下执行,认证失败会抛出异常
            UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
            try {
                if(rememberMe){
                    token.setRememberMe(true);                  
                }else {
                    token.setRememberMe(false);
                }
                subject.login(token);
            } catch (LockedAccountException lae) {
                token.clear();
                request.setAttribute("error", "用户已经被锁定不能登录,请与管理员联系!");
                return "login";
            } 

JAVA层,设置rememberMe。
subject.isRemembered():记住用户后会保存cookie,但是登录的时候可能不是真的你,能用你浏览器的都能打开,像/main=user这种权限都能打开。
subject.isAuthenticated():表示用用户名密码登录的用户,像/userMange=authc都能打开。
像平常权限的网页 建议设置成=user 但是像牵扯到安全事务的比如修改密码之类的 就要设置成=authc
authc拦截器会判断用户是否是通过Subject.login(isAuthenticated()==true)登录的,如果是才放行,否则会跳转到登录页面叫你重新登录。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值