zoukankan      html  css  js  c++  java
  • springboot集成shiro实现权限缓存和记住我

    到这节为止,我们已经实现了身份验证和权限验证。但是,如果我们登录之后多次访问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中添加以下方法。

    /**
    * shiro缓存对象,防止当每次访问带权限的请求时,shiro都去执行权限认证,进行查询权限
    * 也就是说,只需给shiro一次权限即可(缓存),不需要每次查询权限
    * @return
    */
    @Bean(name="ehCacheManager")
    public EhCacheManager ehCacheManager() {
    EhCacheManager ehCacheManager = new EhCacheManager();
    ehCacheManager.setCacheManagerConfigFile("classpath:config/ehcache-shiro.xml");
    return ehCacheManager;
    }
    /**
    * 不指定名字的话,自动创建一个方法名第一个字母小写的bean
    * @Bean(name = "securityManager")
    * @return
    */
    @Bean(name="securityManager")
    public SecurityManager securityManager(@Qualifier("authRealm") MyShiroRealm authRealm,
    @Qualifier("ehCacheManager") EhCacheManager ehCacheManager) {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(authRealm);
    securityManager.setCacheManager(ehCacheManager);//注入缓存对象,防止每访问一个带权限的请求都要shiro去查询数据库的权限
    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"
        />
    
    </ehcache>
    启动项目,再多次访问http://localhost:8080/userInfo/userDel,这时候只会在后台打印一次配置权限的信息了,说明shiro缓存起了作用。
    ---------------------下面我们开始配置记住密码---------------------
     

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

    /**
    * cookie对象;
    * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cookie的有效时间等等。
    * @return
    */
    @Bean
    public SimpleCookie rememberMeCookie(){
    //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
    SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
    //<!-- 记住我cookie生效时间30天 ,单位秒;-->
    simpleCookie.setMaxAge(259200);
    return simpleCookie;
    }
    /**
    * cookie管理对象;
    * rememberMeManager()方法是生成rememberMe管理器,而且要将这个rememberMe管理器设置到securityManager中
    * @return
    */
    @Bean
    public CookieRememberMeManager rememberMeManager(){
    CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
    cookieRememberMeManager.setCookie(rememberMeCookie());
    //rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
    cookieRememberMeManager.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
    return cookieRememberMeManager;
    }
    将rememberMeManager注入到SecurityManager中:
    /**
    * 不指定名字的话,自动创建一个方法名第一个字母小写的bean
    * @Bean(name = "securityManager")
    * @return
    */
    @Bean(name="securityManager")
    public SecurityManager securityManager(@Qualifier("authRealm") MyShiroRealm authRealm,
    @Qualifier("ehCacheManager") EhCacheManager ehCacheManager) {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(authRealm);
    securityManager.setCacheManager(ehCacheManager);//注入缓存对象,防止每访问一个带权限的请求都要shiro去查询数据库的权限
    securityManager.setRememberMeManager(rememberMeManager()); //注入记住我cookie管理器(记住密码)
    return securityManager;
    }
    ShiroFilterFactoryBean中添加记住我过滤器user,添加user过滤器的资源在记住我或认证之后就可以直接访问了。
    .....
    //配置记住我或认证通过可以访问的地址
    filterChainDefinitionMap.put("/", "user");
    filterChainDefinitionMap.put("/index", "user");

    /** authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器
    * org.apache.shiro.web.filter.authc.FormAuthenticationFilter */
    // anon:它对应的过滤器里面是空的,什么都没做,可以理解为不拦截
    .....

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

    <P><input type="checkbox" name="rememberMe" />记住我</P>
    启动项目,正常登录后关闭浏览器,再打开浏览器输入http://localhost:8080/index,这时候就可以直接访问index页面,不需要再登录了。
  • 相关阅读:
    poj2138 Travel Games
    [TJOI2013]松鼠聚会
    [HNOI2013]切糕
    CSS应用
    列表数据显示+分页
    SESSION的应用
    JS中正规表达式的用法以及常用的方法总结
    CSS 定位 (Positioning)
    CSS 边距
    选项卡应用
  • 原文地址:https://www.cnblogs.com/wangjing666/p/7338073.html
Copyright © 2011-2022 走看看