ShiroConfig.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package net.mingsoft.config;
  2. import net.mingsoft.basic.security.BaseAuthRealm;
  3. import org.apache.shiro.mgt.SecurityManager;
  4. import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
  5. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  6. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  7. import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import java.util.LinkedHashMap;
  12. import java.util.Map;
  13. @Configuration
  14. public class ShiroConfig {
  15. @Value("${ms.manager.path}")
  16. private String managerPath;
  17. /**
  18. * 开启Shiro的注解(如@RequiresRoles , @RequiresPermissions),需借助SspringAOP扫描使用Sshiro注解的类,并在必要时进行安全逻辑验证
  19. * 配置以下两个bean(Defaul tAdvisorAutoProxyCreator和uthorizat ionAttributeSourceAdvisor)即可实现此功能
  20. */
  21. @Bean
  22. public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
  23. DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
  24. advisorAutoProxyCreator.setProxyTargetClass(true);
  25. return advisorAutoProxyCreator;
  26. }
  27. /**
  28. * 开启shiro aop注解支持
  29. * 使用代理方式;所以需要开启代码支持
  30. * @param securityManager
  31. */
  32. @Bean
  33. public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
  34. AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
  35. authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
  36. return authorizationAttributeSourceAdvisor;
  37. }
  38. @Bean
  39. public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(
  40. DefaultWebSecurityManager securityManager) {
  41. AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
  42. advisor.setSecurityManager(securityManager);
  43. return advisor;
  44. }
  45. @Bean
  46. public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
  47. DefaultAdvisorAutoProxyCreator autoProxyCreator = new DefaultAdvisorAutoProxyCreator();
  48. autoProxyCreator.setProxyTargetClass(true);
  49. return autoProxyCreator;
  50. }
  51. @Bean
  52. public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
  53. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  54. // 必须设置 SecurityManager
  55. shiroFilterFactoryBean.setSecurityManager(securityManager);
  56. // setLoginUrl 如果不设置值,默认会自动寻找Web工程根目录下的"/login.jsp"页面 或 "/login" 映射
  57. shiroFilterFactoryBean.setLoginUrl(managerPath + "/login.do");
  58. // 设置无权限时跳转的 url;
  59. shiroFilterFactoryBean.setUnauthorizedUrl(managerPath + "/404.do");
  60. // 设置拦截器
  61. Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
  62. // 游客,开发权限
  63. filterChainDefinitionMap.put("/static/**", "anon");
  64. filterChainDefinitionMap.put("/html/**", "anon");
  65. // 开放登陆接口
  66. filterChainDefinitionMap.put(managerPath + "/login.do", "anon");
  67. filterChainDefinitionMap.put(managerPath + "/checkLogin.do", "anon");
  68. // 其余接口一律拦截
  69. // 主要这行代码必须放在所有权限设置的最后,不然会导致所有 url 都被拦截
  70. filterChainDefinitionMap.put(managerPath + "/**", "authc");
  71. shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
  72. return shiroFilterFactoryBean;
  73. }
  74. /**
  75. * 注入 securityManager
  76. */
  77. @Bean
  78. public SecurityManager securityManager() {
  79. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  80. // 设置realm.
  81. securityManager.setRealm(customRealm());
  82. return securityManager;
  83. }
  84. /**
  85. * 自定义身份认证 realm;
  86. * <p>
  87. * 必须写这个类,并加上 @Bean 注解,目的是注入 CustomRealm, 否则会影响 CustomRealm类 中其他类的依赖注入
  88. */
  89. @Bean
  90. public BaseAuthRealm customRealm() {
  91. return new BaseAuthRealm();
  92. }
  93. }