zoukankan      html  css  js  c++  java
  • springboot 集成 shiro

    如果没有了解shiro 可以先去学习shiro:https://www.cnblogs.com/wujiaofen/p/11088973.html

    springboot 整合shiro:

    1、 在spring boot 项目中导入jar

    2、    <!-- shiro -->
    3、            <dependency>
    4、                <groupId>org.apache.shiro</groupId>
    5、                <artifactId>shiro-spring</artifactId>
    6、                <version>1.4.0</version>
    7、            </dependency>
    8、            <!-- shiro-ehcache -->
    9、            <dependency>
    10、                <groupId>org.springframework.boot</groupId>
    11、                <artifactId>spring-boot-starter-cache</artifactId>
    12、            </dependency>
    13、            <dependency>
    14、                <groupId>net.sf.ehcache</groupId>
    15、                <artifactId>ehcache</artifactId>
    16、            </dependency>
    17、            <dependency>
    18、                <groupId>org.apache.shiro</groupId>
    19、                <artifactId>shiro-ehcache</artifactId>
    20、                <version>1.4.0</version>
    21、            </dependency>
    22、            <dependency>
    23、                <groupId>net.sf.json-lib</groupId>
    24、                <artifactId>json-lib</artifactId>
    25、                <version>2.2.3</version>
    26、                <classifier>jdk15</classifier>
    27、        </dependency>

    2、创建基本配置类shiroConfig 和缓存类

    /**
     * shiro 配置类
     * @author Administrator
     *
     */
    @Configuration
    public class ShiroConfig {
    
        /**
         * shiro 过滤器配置
         * @param securityManager
         * @return
         */
        
        @Bean
        public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager)
        {
            ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
            shiroFilterFactoryBean.setSecurityManager(securityManager);    
            /**
             * 过滤器链,对URL配置过滤规则 
             * authc:所有url都必须认证通过才可以访问
             * anon:所有url都都可以匿名访问
             * user:表示身份认证通过或通过记住我认证通过的可以访问
             * 注意点:过滤链定义,从上向下顺序执行,一般将/**放在最为下边 
             * 
             */
            Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();
            //initPermission
            filterChainDefinitionMap.put("/login", "anon");
            filterChainDefinitionMap.put("/initPermission", "anon");
            filterChainDefinitionMap.put("/static/**", "anon");
            filterChainDefinitionMap.put("/logout", "logout"); //配置退出
            filterChainDefinitionMap.put("/**", "user");
            //如果没有认证将要跳转的登陆地址,http可访问的url,如果不在表单认证过虑器FormAuthenticationFilter中指定此地址就为身份认证地址
            shiroFilterFactoryBean.setLoginUrl("/login");
            shiroFilterFactoryBean.setSuccessUrl("/index");
            //shiroFilterFactoryBean.setUnauthorizedUrl("/403");
            
            
            shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
            return shiroFilterFactoryBean;
        }
        
        /**
         * 加密方式
         * @return
         */
        @Bean
        public HashedCredentialsMatcher hashedCredentialsMatcher()
        {
            HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
            hashedCredentialsMatcher.setHashAlgorithmName("md5");
            //散列次数
            hashedCredentialsMatcher.setHashIterations(2);
            return hashedCredentialsMatcher;
        }
        
        /**
         * 认证配置
         * @return
         */
        @Bean
        public MyRealm getRealm()
        {
            MyRealm  myRealm = new MyRealm();
            myRealm.setCredentialsMatcher(hashedCredentialsMatcher());
            myRealm.setCacheManager(ehCacheManager());
            return myRealm;
        }
        
        /**
         * 安全管理器配置
         * @return
         */
        @Bean
        public SecurityManager getSecurityManager()
        {
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            securityManager.setRealm(getRealm());
            securityManager.setCacheManager(ehCacheManager());
            //注入记住我管理器
            securityManager.setRememberMeManager(rememberMeManager());
            return securityManager;
        }
        
        /**
         * 缓存管理器
         * @return
         */
        @Bean
        public EhCacheManager ehCacheManager(){
            EhCacheManager cacheManager = new EhCacheManager();
            cacheManager.setCacheManagerConfigFile("classpath:shiro-ehcache.xml");
            return cacheManager;
        }
        
        /**
          * cookie对象;
          * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cookie的有效时间等等。
          * @return
         */
        @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管理对象;
          * rememberMeManager()方法是生成rememberMe管理器,而且要将这个rememberMe管理器设置到securityManager中
          * @return
         */
        @Bean
        public CookieRememberMeManager rememberMeManager(){
              //System.out.println("ShiroConfiguration.rememberMeManager()");
              CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
              cookieRememberMeManager.setCookie(rememberMeCookie());
              //rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
              cookieRememberMeManager.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
              return cookieRememberMeManager;
        }
    
        /**
         * 开启@RequirePermission注解的配置
         * 要结合DefaultAdvisorAutoProxyCreator一起使用,或者导入aop的依赖
         * @return
         */
        @Bean
        public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager)
        {
            AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
            authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
            return authorizationAttributeSourceAdvisor;
        }
        
        /**
         * aop代理
         * @return
         */
        @Bean
        public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
              DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
              advisorAutoProxyCreator.setProxyTargetClass(true);
              return advisorAutoProxyCreator;
        }
        /**
         * 定义Spring MVC的异常处理器
         * @return
         */
        @Bean
        public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() {
            SimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();
            Properties mappings = new Properties();
            mappings.setProperty("DatabaseException", "databaseError");//数据库异常处理
            mappings.setProperty("UnauthorizedException","403");//处理shiro的认证未通过异常
            r.setExceptionMappings(mappings);  // None by default
            r.setDefaultErrorView("error");    // No default
            r.setExceptionAttribute("ex");     // Default is "exception"
            return r;
        }
    }

    缓存配置类:

    @Configuration
    public class EhcacheConfig {
    
        /**
         * 设置为共享模式
         * @return
         */
        @Bean
        public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
            EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
            cacheManagerFactoryBean.setShared(true);
            return cacheManagerFactoryBean;
        }
    }

    同时需要在resources 源目录添加shiro-ehcache.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache updateCheck="false" dynamicConfig="false">
        <diskStore path="java.io.tmpdir"/>
        <cache name="users"
               timeToLiveSeconds="300"
               maxEntriesLocalHeap="1000"/>
        <!--
            name:缓存名称。
            maxElementsInMemory:缓存最大个数。
            eternal:对象是否永久有效,一但设置了,timeout将不起作用。
            timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
            timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
            overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
            diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
            maxElementsOnDisk:硬盘最大缓存个数。
            diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
            diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
            memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
            clearOnFlush:内存数量最大时是否清除。
        -->
        <defaultCache name="defaultCache"
                      maxElementsInMemory="10000"
                      eternal="false"
                      timeToIdleSeconds="120"
                      timeToLiveSeconds="120"
                      overflowToDisk="false"
                      maxElementsOnDisk="100000"
                      diskPersistent="false"
                      diskExpiryThreadIntervalSeconds="120"
                      memoryStoreEvictionPolicy="LRU"/>
    </ehcache>

    3、自定义Realm 继承AuthorizingRealm 实现doGetAuthenticationInfo【认证】doGetAuthorizationInfo【授权】即可

  • 相关阅读:
    Eclipse设置、调优、使用
    eclipse安装插件的方式 三种:links、eclipse中使用插件安装向导安装、直接copy插件到对应的eclipse目录 MyEclipse10安装SVN插件
    eclipse 在Servers窗口创建一个Tomcat 6.0 Server失败
    小技巧:帮你批量删除代码前的行号
    editplus发布3.01 Build 446 Final版(附下载及中文版)
    eclipse 垃圾回收器,内存释放
    eclipse.ini的相关说明
    Eclipse 去掉JavaScript Validator
    DropBox 超实用的免费文件网络同步、备份、分享工具
    使用EditPlus技巧,提高工作效率(附英文版、自动完成文件、语法文件下载)
  • 原文地址:https://www.cnblogs.com/wujiaofen/p/11095140.html
Copyright © 2011-2022 走看看