zoukankan      html  css  js  c++  java
  • springboot 引入shiro缓存及rememberMe支持

    来源:https://www.jianshu.com/p/22bf52e09e4d

    最终demo

    到这节为止,我们已经实现了身份验证和权限验证。但是,如果我们登录之后多次访问http://localhost:8080/userInfo/userDel的话,会发现权限验证会每次都执行一次。这是有问题的,因为像用户的权限这些我们提供给shiro一次就够了。

    下面,我们开始给shiro添加缓存支持:

    1.添加依赖

            <!-- shiro ehcache -->
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-ehcache</artifactId>
                <version>1.2.2</version>
            </dependency>
    
            <!--
               包含支持UI模版(Velocity,FreeMarker,JasperReports),
               邮件服务,
               脚本服务(JRuby),
               缓存Cache(EHCache),
               任务计划Scheduling(uartz)。
            -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
            </dependency>
    

    2.注入缓存

    com.example.demo.config.Shiro.ShiroConfiguration中添加以下方法。

        @Bean
        public EhCacheManager ehCacheManager() {
            System.out.println("ShiroConfiguration.getEhCacheManager()");
            EhCacheManager ehCacheManager = new EhCacheManager();
            ehCacheManager.setCacheManagerConfigFile("classpath:config/ehcache-shiro.xml");
            return ehCacheManager;
        }
    

    将缓存对象注入到SecurityManager中:

        @Bean
        public SecurityManager securityManager() {
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            securityManager.setRealm(myShiroRealm());
            securityManager.setCacheManager(ehCacheManager()); //注入缓存对象。
            return securityManager;
        }
    

    3.添加配置文件

    在src/main/resouces/config中添加ehcache-shiro.xml配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache name="es">
    
        <diskStore path="java.io.tmpdir"/>
    
        <!--
           name:缓存名称。
           maxElementsInMemory:缓存最大数目
           maxElementsOnDisk:硬盘最大缓存个数。
           eternal:对象是否永久有效,一但设置了,timeout将不起作用。
           overflowToDisk:是否保存到磁盘,当系统当机时
           timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
           timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
           diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
           diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
           diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
           memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
            clearOnFlush:内存数量最大时是否清除。
             memoryStoreEvictionPolicy:
                Ehcache的三种清空策略;
                FIFO,first in first out,这个是大家最熟的,先进先出。
                LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
                LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
        -->
        <defaultCache
                maxElementsInMemory="10000"
                eternal="false"
                timeToIdleSeconds="120"
                timeToLiveSeconds="120"
                overflowToDisk="false"
                diskPersistent="false"
                diskExpiryThreadIntervalSeconds="120"
        />
    
    
        <!-- 登录记录缓存锁定10分钟 -->
        <cache name="passwordRetryCache"
               maxEntriesLocalHeap="2000"
               eternal="false"
               timeToIdleSeconds="3600"
               timeToLiveSeconds="0"
               overflowToDisk="false"
               statistics="true">
        </cache>
    
    </ehcache>
    

    启动项目,再多次访问http://localhost:8080/userInfo/userDel,这时候只会在后台打印一次配置权限的信息了,说明shiro缓存起了作用。

    ---------------------下面我们开始配置记住密码-----------

    1.在com.example.demo.config.Shiro.ShiroConfiguration中加入下面两个方法:

        //cookie对象;
        @Bean
        public SimpleCookie rememberMeCookie() {
            System.out.println("ShiroConfiguration.rememberMeCookie()");
            //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
            SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
    
            //<!-- 记住我cookie生效时间30天 ,单位秒;-->
            simpleCookie.setMaxAge(259200);
            return simpleCookie;
        }
    
        //cookie管理对象;
        @Bean
        public CookieRememberMeManager cookieRememberMeManager() {
            System.out.println("ShiroConfiguration.rememberMeManager()");
            CookieRememberMeManager manager = new CookieRememberMeManager();
            manager.setCookie(rememberMeCookie());
            return manager;
        }
    

    将rememberMeManager注入到SecurityManager中

    @Bean
        public SecurityManager securityManager() {
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            securityManager.setRealm(myShiroRealm());
            securityManager.setCacheManager(ehCacheManager());
            securityManager.setRememberMeManager(cookieRememberMeManager()); //注入rememberMeManager;
            return securityManager;
        }
    

    ShiroFilterFactoryBean中添加记住我过滤器user,添加user过滤器的资源在记住我或认证之后就可以直接访问了。

    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
    ...
            filterChainDefinitionMap.put("/index", "user");
            filterChainDefinitionMap.put("/", "user");
    ....
    

    最后,在login.html页面添加记住我单选框

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

    启动项目,正常登录后关闭浏览器,再打开浏览器输入http://localhost:8080/index,这时候就可以直接访问index页面,不需要再登录了。

    SpringBoot + Shiro (一)基础工程搭建
    SpringBoot + Shiro (二)身份校验和角色设置
    SpringBoot + Shiro (三)权限
    SpringBoot + Shiro (四)缓存&记住密码
    SpringBoot + Shiro (五)验证码

    最后,感谢几位作者的文章解惑:
    springboot整合shiro-登录认证和权限管理
    Spring Boot Shiro权限管理【从零开始学Spring Boot】
    Spring boot 中使用Shiro



    作者:忧郁的小码仔
    链接:https://www.jianshu.com/p/22bf52e09e4d
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    linux 磁盘挂载及查看磁盘
    【转】Linux 如何通过命令仅获取IP地址
    【转】CentOS 7 安装配置 NFS
    【转】利用virtualenv管理Python环境
    ssh 常用命令
    JavaScript 视频教程 收藏
    MySQL Json类型的数据处理
    Nhibernate + MySQL 类型映射
    ABP框架服务层的接口与实现(增删改查)
    ABP框架源码中的Linq扩展方法
  • 原文地址:https://www.cnblogs.com/kinome/p/12306182.html
Copyright © 2011-2022 走看看