ShiroConfig.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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.List;
  25. import java.util.List;
  26. import java.util.Map;
  27. @Configuration
  28. public class ShiroConfig {
  29. private final JwtContext jwtContext;
  30. private final DaqProperties properties;
  31. private final UserAuthService userAuthService;
  32. public ShiroConfig(JwtContext jwtContext, DaqProperties properties, UserAuthService userAuthService) {
  33. this.jwtContext = jwtContext;
  34. this.properties = properties;
  35. this.userAuthService = userAuthService;
  36. }
  37. /**
  38. * 保证实现了Shiro内部lifecycle函数的bean执行
  39. */
  40. @Bean(name = "lifecycleBeanPostProcessor")
  41. public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
  42. return new LifecycleBeanPostProcessor();
  43. }
  44. /**
  45. * 注册的登录认证适配器,实际场景中需要自定义实现
  46. *
  47. * @return /
  48. */
  49. @Bean
  50. public LoginAuthAdapter authAdapter() {
  51. // return new SimpleLoginAuthAdapter();
  52. return new ShiroLoginAuthAdapter(this.userAuthService);
  53. }
  54. @Bean
  55. public AuthBridgeService authBridgeService() {
  56. return new AuthBridgeService(this.authAdapter());
  57. }
  58. /**
  59. * 创建cookie对象
  60. */
  61. @Bean(name = "sessionIdCookie")
  62. public SimpleCookie simpleCookie() {
  63. SimpleCookie simpleCookie = new SimpleCookie();
  64. simpleCookie.setName("ShiroSession");
  65. return simpleCookie;
  66. }
  67. /**
  68. * 权限管理器
  69. */
  70. @Bean(name = "securityManager")
  71. public DefaultWebSecurityManager defaultWebSecurityManager() {
  72. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  73. securityManager.setRealm(shiroDbRealm());
  74. securityManager.setSessionManager(shiroSessionManager());
  75. return securityManager;
  76. }
  77. /**
  78. * 自定义的密码匹配器,rsa
  79. *
  80. * @return /
  81. */
  82. @Bean
  83. public CredentialsMatcher credentialsMatcher() {
  84. // HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
  85. // matcher.setHashAlgorithmName("SHA-256");
  86. // matcher.setHashIterations(1000);
  87. // matcher.setStoredCredentialsHexEncoded(true);
  88. // return matcher;
  89. return new ShiroRsaCredentialsMatcher(this.properties);
  90. }
  91. /**
  92. * 自定义RealmImpl
  93. */
  94. @Bean(name = "shiroDbRealm")
  95. public ShiroDbRealm shiroDbRealm() {
  96. return new ShiroDbRealmImpl(this.authBridgeService(), this.credentialsMatcher());
  97. }
  98. /**
  99. * 会话管理器
  100. */
  101. @Bean(name = "sessionManager")
  102. public DefaultWebSessionManager shiroSessionManager() {
  103. DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
  104. sessionManager.setSessionValidationSchedulerEnabled(false);
  105. sessionManager.setSessionIdCookieEnabled(true);
  106. sessionManager.setSessionIdCookie(simpleCookie());
  107. sessionManager.setGlobalSessionTimeout(3600000);
  108. return sessionManager;
  109. }
  110. /**
  111. * AOP式方法级权限检查
  112. */
  113. @Bean
  114. @DependsOn("lifecycleBeanPostProcessor")
  115. public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
  116. DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
  117. defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
  118. return defaultAdvisorAutoProxyCreator;
  119. }
  120. /**
  121. * 配合DefaultAdvisorAutoProxyCreator事项注解权限校验
  122. */
  123. @Bean
  124. public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor() {
  125. AuthorizationAttributeSourceAdvisor aasa = new AuthorizationAttributeSourceAdvisor();
  126. aasa.setSecurityManager(defaultWebSecurityManager());
  127. return new AuthorizationAttributeSourceAdvisor();
  128. }
  129. /**
  130. * Shiro过滤器
  131. */
  132. @Bean("shiroFilter")
  133. public ShiroFilterFactoryBean shiroFilterFactoryBean() {
  134. ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
  135. shiroFilter.setSecurityManager(this.defaultWebSecurityManager());
  136. // 新增过滤器
  137. Map<String, Filter> filterMap = MapUtil.newHashMap(true);
  138. filterMap.put("jwt", new JwtFilter(this.jwtContext));
  139. shiroFilter.setFilters(filterMap);
  140. // 过滤器链配置
  141. Map<String, String> filterChainMap = MapUtil.newHashMap(16, true);
  142. List<DaqProperties.FilterChain> shiroFilterChain = this.properties.getShiroFilterChain();
  143. for (DaqProperties.FilterChain filterChain : shiroFilterChain) {
  144. filterChainMap.put(filterChain.getPath(), String.join(",", filterChain.getFilters()));
  145. }
  146. shiroFilter.setFilterChainDefinitionMap(filterChainMap);
  147. // 去掉,防止404路由自动跳转到登录请求
  148. // shiroFilter.setLoginUrl("/v1/login");
  149. // shiroFilter.setUnauthorizedUrl("/v1/login");
  150. return shiroFilter;
  151. }
  152. }