08.关于shiro集成Spring、SpringMvc、SpringData实现remenberMe

今天写登录功能,想要实现记住我功能,然后到处找了一些,始终不够完整,于是我就自己研究了最终实现如下

1.在登录页面加入“记住我”复选框,如下

<input type="checkbox" name="rememberMe" value="true">记住我</input>

需要注意的是,这里的name,只能写为remeberMe,因为shiro内部集成了会自动获取这个字段的值,后面的value="true",这个是我自己加上去的,相当于是一个默认值,默认为记住我状态

2.后台Controller里面接收参数:

//获取当前登录主体  
Subject subject = SecurityUtils.getSubject();  
//如果当前用户还没有认证  
try {  
    //如果当前主体未认证,就开始认证  
  if (!subject.isAuthenticated()) {  
  
        //将传入的用户名和密码封装到UsernamePasswordToken  
        subject.login(token);  
        Employee employee = (Employee)  subject.getPrincipal();  
        //登录成功之后将当前用户对象放到session中去  
        SessionUtil.setUserSession(employee);  
        //记住我  
         token.setRememberMe(true);  
  }  
  
    return new AjaxResult();

需要注意的是,我做的是在这里登录成功之后,就直接就setRememberMe(true),当然,这里可以自己加判断,有if语句和三目都可以实现,基于你的需求不一样而已。

3.配置权限

我这里是自定义的map集合来动态获取数据库中的权限,以及添加新的权限请求,如果需要具体配置的方法介绍,可以留言

public class MyFilterChainDefinitionMap {  
  
    @Autowired  
    private IPermissionService permissionService;  
  
    /**  
    * 动态获取数据库中的权限  
    * @return  
    */  
    public Map<String,String> createMap(){  
  
    //准备一个map集合  
    Map<String,String> map = new LinkedHashMap<>();  
  
    //通过注入的IPermissionService对象来查找出所有的Permission(权限对象)  
    List<Permission> permissionList = permissionService.findAll();  
  
    //循环遍历所有的Permission  
    for (Permission permission : permissionList) {  
        //在过程中,动态添加权限 --//url(=== /employee/save) 对应 sn(=== employee:save)           //ArvinPermission是自定义的过滤器  
        map.put(permission.getUrl(),"ArvinPermission["+permission.getSn()+"]");  
    }  
        //直接放行登录请求  
        map.put("/login","anon");  
  
        //这里用于对所有的静态资源进行放行  
        map.put("/static/**","anon");  
        //注销请求  
        map.put("/logout","logout");  
        //拦截所有请求,需要认证才能通行  
        //map.put("/**","authc");  
  
        // --- /** = user 表示对访问所有地址对认证过的用户进行放行  
        map.put("/**","user");  
        return map;  
  
  }  
}

在这个里面就是将原来的map.put("/**","authc");替换为map.put("/**","user");,相当于原来所有的请求都需要认证,而现在就是所有的请求对认证过的主体进行放行(不等于不需要权限访问所有链接)

4.shiro.xml配置

<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <!--设置cookie的名称-->
        <constructor-arg value="rememberMe"/>
        <property name="httpOnly" value="true"/>
        <!--30*24*60*60 = 2592000(天*小时*分钟*秒钟) 设置cookie的存活时间 -->
        <property name="maxAge" value="2592000"/><!-- 30 天 -->
</bean>
    
<!-- rememberMe 管理器 -->  
<!--rememberMe 管理器,cipherKey 是加密 rememberMe Cookie 的密钥;默认 AES 算法-->  
<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>  
  
<!-- 会话ID生成器 -->  
<bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>  
  
<!-- 会话Cookie模板,使用sid存储sessionid -->  
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  
 <constructor-arg value="sid"/>  
 <property name="httpOnly" value="true"/>  
  <!--这里就是设置的一次会话管半个小时-->  
  <property name="maxAge" value="180000"/>  
</bean>  
  
<!-- 会话DAO -->  
<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">  
 <property name="activeSessionsCacheName" value\="shiro-activeSessionCache"/>  
 <property name="sessionIdGenerator" ref="sessionIdGenerator"/>  
</bean>  
  
<!-- 会话验证调度器 -->  
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">  
 <property name="sessionValidationInterval" value="1800000"/>  
 <property name="sessionManager" ref="sessionManager"/>  
</bean>  
  
<!-- 会话管理器 -->  
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">  
  <!--失效时间,单位为毫秒-->  
  <property name="globalSessionTimeout" value="1800000"/>  
  <!--&lt;!&ndash;删除无效session&ndash;&gt; -->  
  <property name="deleteInvalidSessions" value="true"/>  
 <property name="sessionValidationSchedulerEnabled" value="true"/>  
 <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>  
 <property name="sessionDAO" ref="sessionDAO"/>  
 <property name="sessionIdCookieEnabled" value="true"/>  
 <property name="sessionIdCookie" ref="sessionIdCookie"/>  
</bean>

这里配置结束之后,需要再将sessionManagerrememberMeManager配置进shiro的核心对象securityManager

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="arvinRealm"/>
        <property name="sessionManager" ref="sessionManager"/>
        <!--引入记住我属性-->
        <property name="rememberMeManager" ref="rememberMeManager"/>
    </bean>

到这里,我们的记住我功能就全部实现

上一篇:【免费下载】全套最新 014SpringData 视频教程+教学资料+学习课件+源代码+软件开发工具


下一篇:Linux下FastDFS安装教程