ShiroConfig.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package com.wsm.admin.shiro;
  2. import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
  3. import com.wsm.admin.service.IResourceService;
  4. import com.wsm.common.shiro.ShiroManager;
  5. import org.apache.shiro.cache.CacheManager;
  6. import org.apache.shiro.cache.MemoryConstrainedCacheManager;
  7. import org.apache.shiro.codec.Base64;
  8. import org.apache.shiro.mgt.DefaultSecurityManager;
  9. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  10. import org.apache.shiro.web.mgt.CookieRememberMeManager;
  11. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  12. import org.apache.shiro.web.servlet.SimpleCookie;
  13. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  14. import org.springframework.context.annotation.Bean;
  15. import org.springframework.context.annotation.Configuration;
  16. import org.springframework.context.annotation.DependsOn;
  17. import org.springframework.context.annotation.Import;
  18. import javax.annotation.Resource;
  19. import java.util.LinkedHashMap;
  20. import java.util.List;
  21. import java.util.Map;
  22. @Configuration
  23. @Import(ShiroManager.class)
  24. public class ShiroConfig {
  25. @Resource
  26. private IResourceService resourceService;
  27. @Bean(name = "myShiroRealm")
  28. @DependsOn("lifecycleBeanPostProcessor")
  29. public MyShiroRealm myShiroRealm() {
  30. return new MyShiroRealm();
  31. }
  32. @Bean
  33. public ShiroDialect shiroDialect() {
  34. return new ShiroDialect();
  35. }
  36. /**
  37. * 用户授权信息Cache
  38. */
  39. @Bean(name = "shiroCacheManager")
  40. @ConditionalOnMissingBean
  41. public CacheManager cacheManager() {
  42. return new MemoryConstrainedCacheManager();
  43. }
  44. @Bean
  45. public SimpleCookie rememberMeCookie() {
  46. //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
  47. SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
  48. //如果httyOnly设置为true,则客户端不会暴露给客户端脚本代码,使用HttpOnly cookie有助于减少某些类型的跨站点脚本攻击;
  49. simpleCookie.setHttpOnly(true);
  50. //记住我cookie生效时间,默认30天 ,单位秒:60 * 60 * 24 * 30
  51. simpleCookie.setMaxAge(259200);
  52. return simpleCookie;
  53. }
  54. @Bean
  55. public CookieRememberMeManager rememberMeManager() {
  56. CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
  57. //rememberme cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位),通过以下代码可以获取
  58. //KeyGenerator keygen = KeyGenerator.getInstance("AES");
  59. //SecretKey deskey = keygen.generateKey();
  60. //System.out.println(Base64.encodeToString(deskey.getEncoded()));
  61. byte[] cipherKey = Base64.decode("wGiHplamyXlVB11UXWol8g==");
  62. cookieRememberMeManager.setCipherKey(cipherKey);
  63. cookieRememberMeManager.setCookie(rememberMeCookie());
  64. return cookieRememberMeManager;
  65. }
  66. @Bean(name = "securityManager")
  67. @ConditionalOnMissingBean
  68. public DefaultSecurityManager securityManager() {
  69. DefaultSecurityManager sm = new DefaultWebSecurityManager();
  70. sm.setRealm(myShiroRealm());
  71. sm.setCacheManager(cacheManager());
  72. //注入记住我管理器
  73. sm.setRememberMeManager(rememberMeManager());
  74. return sm;
  75. }
  76. @Bean(name = "shiroFilter")
  77. public ShiroFilterFactoryBean getShiroFilterFactoryBean() throws Exception {
  78. ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
  79. shiroFilter.setSecurityManager(securityManager());
  80. shiroFilter.setLoginUrl("/admin/login");
  81. //登录成功后要跳转的链接
  82. shiroFilter.setSuccessUrl("/admin/index");
  83. //未授权界面
  84. shiroFilter.setUnauthorizedUrl("/previlige/no");
  85. //拦截器.
  86. Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
  87. //配置不会被拦截的链接 顺序判断
  88. //静态资源不拦截
  89. filterChainDefinitionMap.put("/", "anon");
  90. filterChainDefinitionMap.put("/webSocketServer/**", "anon");
  91. filterChainDefinitionMap.put("/live/**", "anon");
  92. filterChainDefinitionMap.put("/static/**", "anon");
  93. filterChainDefinitionMap.put("/index.html", "anon");
  94. filterChainDefinitionMap.put("/css/**", "anon");
  95. filterChainDefinitionMap.put("/img/**", "anon");
  96. filterChainDefinitionMap.put("/js/**", "anon");
  97. filterChainDefinitionMap.put("/plugins/**", "anon");
  98. filterChainDefinitionMap.put("/audio/**", "anon");
  99. //登录链接不拦截
  100. filterChainDefinitionMap.put("/admin/login", "anon");
  101. filterChainDefinitionMap.put("/admin", "anon");
  102. filterChainDefinitionMap.put("/kaptcha", "anon");
  103. filterChainDefinitionMap.put("/api/**", "anon");
  104. filterChainDefinitionMap.put("/test", "anon");
  105. filterChainDefinitionMap.put("/**", "authc");
  106. /*Map<String, Filter> filters = shiroFilter.getFilters();
  107. filters.put("authc", new CustomFormAuthenticationFilter());*/
  108. List<com.wsm.admin.model.Resource> list = resourceService.findAll();
  109. for (com.wsm.admin.model.Resource resource : list) {
  110. filterChainDefinitionMap.put(resource.getUrl(), "perms[" + resource.getResourceKey() + "]");
  111. }
  112. shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
  113. return shiroFilter;
  114. }
  115. }