ShiroConfig.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. package com.simuwang.base.config;
  2. import cn.hutool.core.map.MapUtil;
  3. import com.simuwang.base.components.ShiroLoginAuthAdapter;
  4. import com.simuwang.base.components.ShiroRsaCredentialsMatcher;
  5. import com.simuwang.base.components.UserAuthService;
  6. import com.simuwang.shiro.core.ShiroDbRealm;
  7. import com.simuwang.shiro.core.adapter.LoginAuthAdapter;
  8. import com.simuwang.shiro.core.bridge.AuthBridgeService;
  9. import com.simuwang.shiro.core.ShiroDbRealmImpl;
  10. import com.simuwang.shiro.core.jwt.JwtContext;
  11. import com.simuwang.shiro.core.jwt.JwtFilter;
  12. import jakarta.servlet.Filter;
  13. import org.apache.shiro.authc.credential.CredentialsMatcher;
  14. import org.apache.shiro.spring.LifecycleBeanPostProcessor;
  15. import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
  16. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  17. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  18. import org.apache.shiro.web.servlet.SimpleCookie;
  19. import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
  20. import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
  21. import org.springframework.context.annotation.Bean;
  22. import org.springframework.context.annotation.Configuration;
  23. import org.springframework.context.annotation.DependsOn;
  24. import java.util.HashMap;
  25. import java.util.Map;
  26. @Configuration
  27. public class ShiroConfig {
  28. private final JwtContext jwtContext;
  29. private final DaqProperties properties;
  30. private final UserAuthService userAuthService;
  31. public ShiroConfig(JwtContext jwtContext, DaqProperties properties, UserAuthService userAuthService) {
  32. this.jwtContext = jwtContext;
  33. this.properties = properties;
  34. this.userAuthService = userAuthService;
  35. }
  36. /**
  37. * 保证实现了Shiro内部lifecycle函数的bean执行
  38. */
  39. @Bean(name = "lifecycleBeanPostProcessor")
  40. public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
  41. return new LifecycleBeanPostProcessor();
  42. }
  43. /**
  44. * 注册的登录认证适配器,实际场景中需要自定义实现
  45. *
  46. * @return /
  47. */
  48. @Bean
  49. public LoginAuthAdapter authAdapter() {
  50. // return new SimpleLoginAuthAdapter();
  51. return new ShiroLoginAuthAdapter(this.userAuthService);
  52. }
  53. @Bean
  54. public AuthBridgeService authBridgeService() {
  55. return new AuthBridgeService(this.authAdapter());
  56. }
  57. /**
  58. * 创建cookie对象
  59. */
  60. @Bean(name = "sessionIdCookie")
  61. public SimpleCookie simpleCookie() {
  62. SimpleCookie simpleCookie = new SimpleCookie();
  63. simpleCookie.setName("ShiroSession");
  64. return simpleCookie;
  65. }
  66. /**
  67. * 权限管理器
  68. */
  69. @Bean(name = "securityManager")
  70. public DefaultWebSecurityManager defaultWebSecurityManager() {
  71. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  72. securityManager.setRealm(shiroDbRealm());
  73. securityManager.setSessionManager(shiroSessionManager());
  74. return securityManager;
  75. }
  76. /**
  77. * 自定义的密码匹配器,rsa
  78. *
  79. * @return /
  80. */
  81. @Bean
  82. public CredentialsMatcher credentialsMatcher() {
  83. // HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
  84. // matcher.setHashAlgorithmName("SHA-256");
  85. // matcher.setHashIterations(1000);
  86. // matcher.setStoredCredentialsHexEncoded(true);
  87. // return matcher;
  88. return new ShiroRsaCredentialsMatcher(this.properties);
  89. }
  90. /**
  91. * 自定义RealmImpl
  92. */
  93. @Bean(name = "shiroDbRealm")
  94. public ShiroDbRealm shiroDbRealm() {
  95. return new ShiroDbRealmImpl(this.authBridgeService(), this.credentialsMatcher());
  96. }
  97. /**
  98. * 会话管理器
  99. */
  100. @Bean(name = "sessionManager")
  101. public DefaultWebSessionManager shiroSessionManager() {
  102. DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
  103. sessionManager.setSessionValidationSchedulerEnabled(false);
  104. sessionManager.setSessionIdCookieEnabled(true);
  105. sessionManager.setSessionIdCookie(simpleCookie());
  106. sessionManager.setGlobalSessionTimeout(3600000);
  107. return sessionManager;
  108. }
  109. /**
  110. * AOP式方法级权限检查
  111. */
  112. @Bean
  113. @DependsOn("lifecycleBeanPostProcessor")
  114. public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
  115. DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
  116. defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
  117. return defaultAdvisorAutoProxyCreator;
  118. }
  119. /**
  120. * 配合DefaultAdvisorAutoProxyCreator事项注解权限校验
  121. */
  122. @Bean
  123. public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
  124. AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
  125. aasa.setSecurityManager(defaultWebSecurityManager());
  126. return new AuthorizationAttributeSourceAdvisor();
  127. }
  128. /**
  129. * 过滤器链
  130. */
  131. private Map<String, String> filterChainDefinition() {
  132. Map<String, String> map = MapUtil.newHashMap(20, true);
  133. map.put("/static/**", "anon");
  134. map.put("/v1/login", "anon");
  135. map.put("/v1/rsa-key", "anon");
  136. map.put("/test/**", "anon");
  137. map.put("/v1/**", "anon");
  138. map.put("/**", "anon");
  139. return map;
  140. }
  141. // @Bean
  142. // public JwtContext jwtUtil() {
  143. // return new JwtContext(this.properties);
  144. // }
  145. private Map<String, Filter> filterMap() {
  146. HashMap<String, Filter> map = MapUtil.newHashMap();
  147. map.put("jwt", new JwtFilter(this.properties, this.jwtContext));
  148. return map;
  149. }
  150. /**
  151. * Shiro过滤器
  152. */
  153. @Bean("shiroFilter")
  154. public ShiroFilterFactoryBean shiroFilterFactoryBean() {
  155. ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
  156. shiroFilter.setSecurityManager(this.defaultWebSecurityManager());
  157. shiroFilter.setFilters(this.filterMap());
  158. shiroFilter.setFilterChainDefinitionMap(this.filterChainDefinition());
  159. // 去掉,防止404路由自动跳转到登录请求
  160. // shiroFilter.setLoginUrl("/v1/login");
  161. // shiroFilter.setUnauthorizedUrl("/v1/login");
  162. return shiroFilter;
  163. }
  164. }