实现shiro-remember功能

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

userNametype="text"id="userName" name="userName"value="" />
password:type="text" id="password" name="password" value="${user.password}"/>
下次自动登录:"checkbox"id="rememberMe"name="rememberMe" value="true"/>
type="button" id="login" value="login"/>"red"/>${error}

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

  
<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"/>  
bean> 

sessionIdCookie:maxAge=-1表示浏览器关闭时失效此Cookie;
rememberMeCookie:即记住我的Cookie,保存时长30天;

  
<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


<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

    
    
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
          
        <property name="securityManager" ref="securityManager"/>
          
        <property name="loginUrl" value="login"/>
          
        <property name="unauthorizedUrl" value="unauthorizedUrl"/>  
          
        <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)登录的,如果是才放行,否则会跳转到登录页面叫你重新登录。

你可能感兴趣的:(Spring,myBatis,shiro)