1
0

ShiroConfig.java 6.0 KB

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