Chinaunix首页 | 论坛 | 博客
  • 博客访问: 613649
  • 博文数量: 298
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3077
  • 用 户 组: 普通用户
  • 注册时间: 2019-06-17 10:57
文章分类

全部博文(298)

文章存档

2022年(96)

2021年(201)

2019年(1)

我的朋友

分类: Java

2022-05-16 16:15:25


点击(此处)折叠或打开


  1. ckage org.fh.config;
  2.  
  3. import org.apache.shiro.cache.ehcache.EhCacheManager;
  4. import org.apache.shiro.spring.LifecycleBeanPostProcessor;
  5. import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
  6. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  7. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  8. import org.fh.realm.MyShiroRealm;
  9. import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
  10. import org.springframework.context.annotation.Bean;
  11. import org.springframework.context.annotation.Configuration;
  12. import org.springframework.transaction.annotation.EnableTransactionManagement;
  13.  
  14. import net.sf.ehcache.CacheManager;
  15.  
  16. import java.util.LinkedHashMap;
  17. import java.util.Map;
  18.  
  19. /**
  20.  * 说明:Shiro 配置
  21.  * 作者:FH Admin
  22.  * from:fhadmin.cn
  23.  */
  24. @Configuration
  25. @EnableTransactionManagement
  26. public class ShiroConfiguration {
  27.  
  28.     /**
  29.      * ShiroFilterFactoryBean 处理拦截资源文件问题
  30.      * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,因为在
  31.      * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
  32.      *
  33.      * Filter Chain定义说明
  34.      * 1、一个URL可以配置多个Filter,使用逗号分隔
  35.      * 2、当设置多个过滤器时,全部验证通过,才视为通过
  36.      * 3、部分过滤器可指定参数,如perms,roles
  37.      */
  38.     
  39.     @Bean(name = "shiroFilter")
  40.     public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
  41.         ShiroFilterFactoryBean factoryBean = new MyShiroFilterFactoryBean();
  42.         factoryBean.setSecurityManager(securityManager);
  43.         factoryBean.setLoginUrl("/");                    // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
  44.         factoryBean.setSuccessUrl("/main/index");        // 登录成功后要跳转的连接
  45.         factoryBean.setUnauthorizedUrl("/");
  46.         loadShiroFilterChain(factoryBean);
  47.         return factoryBean;
  48.     }
  49.     
  50.     /**
  51.      * 加载ShiroFilter权限控制规则
  52.      */
  53.     private void loadShiroFilterChain(ShiroFilterFactoryBean factoryBean) {
  54.         /** 下面这些规则配置最好配置到配置文件中 */
  55.         Map<String, String> filterChainMap = new LinkedHashMap<String, String>();
  56.         /**
  57.          * authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器 org.apache.shiro.web.filter.authc.FormAuthenticationFilter
  58.          * anon:它对应的过滤器里面是空的,什么都没做,可以理解为不拦截
  59.          * authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问
  60.         */
  61.         filterChainMap.put("/404/**", "anon");
  62.         filterChainMap.put("/assets/**", "anon");
  63.         filterChainMap.put("/admin/check", "anon");
  64.         filterChainMap.put("/admin/islogin", "anon");
  65.         filterChainMap.put("/admin/register", "anon");
  66.         filterChainMap.put("/textextraction/add", "anon");
  67.         filterChainMap.put("/**", "authc");
  68.         factoryBean.setFilterChainDefinitionMap(filterChainMap);
  69.     }
  70.     
  71.     @Bean
  72.     public EhCacheManager ehCacheManager(CacheManager cacheManager) {
  73.         EhCacheManager em = new EhCacheManager();
  74.         em.setCacheManager(cacheManager);
  75.         return em;
  76.     }
  77.  
  78.     @Bean(name = "myShiroRealm")
  79.     public MyShiroRealm myShiroRealm(EhCacheManager ehCacheManager) {
  80.         MyShiroRealm realm = new MyShiroRealm();
  81.         realm.setCacheManager(ehCacheManager);
  82.         return realm;
  83.     }
  84.  
  85.     @Bean(name = "lifecycleBeanPostProcessor")
  86.     public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
  87.         return new LifecycleBeanPostProcessor();
  88.     }
  89.  
  90.     @Bean
  91.     public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
  92.         DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();
  93.         creator.setProxyTargetClass(true);
  94.         return creator;
  95.     }
  96.  
  97.     @Bean(name = "securityManager")
  98.     public DefaultWebSecurityManager defaultWebSecurityManager(MyShiroRealm realm, EhCacheManager ehCacheManager) {
  99.         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  100.         securityManager.setRealm(realm);    // 设置realm
  101.         securityManager.setCacheManager(ehCacheManager);
  102.         return securityManager;
  103.     }
  104.  
  105.     @Bean
  106.     public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
  107.             DefaultWebSecurityManager securityManager) {
  108.         AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
  109.         advisor.setSecurityManager(securityManager);
  110.         return advisor;
  111.     }
  112.  
  113.     /*
  114.      * 1.LifecycleBeanPostProcessor,这是个DestructionAwareBeanPostProcessor的子类,负责org.
  115.      * apache.shiro.util.Initializable类型bean的生命周期的,初始化和销毁。主要是AuthorizingRealm类的子类,
  116.      * 以及EhCacheManager类。
  117.      * 2.HashedCredentialsMatcher,这个类是为了对密码进行编码的,防止密码在数据库里明码保存,当然在登陆认证的生活,
  118.      * 这个类也负责对form里输入的密码进行编码。
  119.      * 3.ShiroRealm,这是个自定义的认证类,继承自AuthorizingRealm,负责用户的认证和权限的处理,可以参考JdbcRealm的实现。
  120.      * 4.EhCacheManager,缓存管理,用户登陆成功后,把用户信息和权限信息缓存起来,然后每次用户请求时,放入用户的session中,
  121.      * 如果不设置这个bean,每个请求都会查询一次数据库。
  122.      * 5.SecurityManager,权限管理,这个类组合了登陆,登出,权限,session的处理,是个比较重要的类。
  123.      * 6.ShiroFilterFactoryBean,是个factorybean,为了生成ShiroFilter。它主要保持了三项数据,
  124.      * securityManager,filters,filterChainDefinitionManager。
  125.      * 7.DefaultAdvisorAutoProxyCreator,Spring的一个bean,由Advisor决定对哪些类的方法进行AOP代理。
  126.      * 8.AuthorizationAttributeSourceAdvisor,shiro里实现的Advisor类,
  127.      * 内部使用AopAllianceAnnotationsAuthorizingMethodInterceptor来拦截用以下注解的方法。
  128.      */
  129.  
  130. }


阅读(499) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~