ShiroConfig.kt 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package cn.gygxzc.envir.config.shiro
  2. import cn.gygxzc.envir.config.jwt.JwtConfig
  3. import cn.gygxzc.envir.config.shiro.cache.JwtRedisCache
  4. import cn.gygxzc.envir.config.shiro.cache.RedisConfiguration
  5. import cn.gygxzc.envir.config.shiro.cache.ShiroRedisSessionDAO
  6. import cn.gygxzc.envir.config.shiro.filter.*
  7. import cn.gygxzc.envir.config.shiro.realm.ZenShiroRealm
  8. import cn.gygxzc.envir.config.shiro.session.ZenWebSessionManager
  9. import org.apache.shiro.authc.credential.HashedCredentialsMatcher
  10. import org.apache.shiro.cache.CacheManager
  11. import org.apache.shiro.mgt.SecurityManager
  12. import org.apache.shiro.realm.AuthorizingRealm
  13. import org.apache.shiro.session.mgt.SessionManager
  14. import org.apache.shiro.spring.LifecycleBeanPostProcessor
  15. import org.apache.shiro.spring.web.ShiroFilterFactoryBean
  16. import org.apache.shiro.web.filter.authc.AnonymousFilter
  17. import org.apache.shiro.web.mgt.DefaultWebSecurityManager
  18. import org.apache.shiro.web.servlet.SimpleCookie
  19. import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
  20. import org.springframework.boot.web.servlet.FilterRegistrationBean
  21. import org.springframework.context.annotation.Bean
  22. import org.springframework.context.annotation.Configuration
  23. import org.springframework.context.annotation.DependsOn
  24. import org.springframework.core.annotation.Order
  25. import org.springframework.web.filter.DelegatingFilterProxy
  26. import javax.servlet.DispatcherType
  27. import javax.servlet.Filter
  28. /**
  29. * Shiro配置
  30. * @author NorthLan
  31. * @date 2018/4/21
  32. * @url https://noahlan.com
  33. */
  34. @Configuration
  35. @ConditionalOnClass(value = [RedisConfiguration::class])
  36. class ShiroConfig {
  37. @Bean("shiroLifecycleBeanPostProcessor")
  38. fun lifecycleBeanPostProcessor(): LifecycleBeanPostProcessor {
  39. return LifecycleBeanPostProcessor()
  40. }
  41. @Bean
  42. @DependsOn(value = ["shiroLifecycleBeanPostProcessor", "shrioRedisCacheManager"])
  43. fun userRealm(cacheManager: CacheManager): ZenShiroRealm {
  44. val shiroRealm = ZenShiroRealm()
  45. .apply {
  46. isCachingEnabled = true
  47. isAuthenticationCachingEnabled = true
  48. isAuthorizationCachingEnabled = true
  49. //加密验证方法
  50. credentialsMatcher = HashedCredentialsMatcher().also {
  51. it.hashAlgorithmName = "md5"
  52. it.hashIterations = 2 // 两次md5
  53. }
  54. }
  55. shiroRealm.cacheManager = cacheManager
  56. return shiroRealm
  57. }
  58. @Bean(name = ["sessionManager"])
  59. fun defaultWebSessionManager(redisCacheManager: CacheManager,
  60. redisSessionDAO: ShiroRedisSessionDAO): ZenWebSessionManager {
  61. return ZenWebSessionManager().apply {
  62. setCacheManager(redisCacheManager)
  63. globalSessionTimeout = 604800 * 1000
  64. isDeleteInvalidSessions = true
  65. isSessionValidationSchedulerEnabled = true
  66. isDeleteInvalidSessions = true
  67. sessionDAO = redisSessionDAO
  68. sessionIdCookie = SimpleCookie(ZenHttpSession.DEFAULT_SESSION_ID_NAME).apply {
  69. isHttpOnly = true
  70. maxAge = 604800
  71. }
  72. }
  73. }
  74. @Bean(name = ["securityManager"])
  75. fun securityManager(userRealm: AuthorizingRealm,
  76. redisCacheManager: CacheManager,
  77. sessionManager: SessionManager): DefaultWebSecurityManager {
  78. return DefaultWebSecurityManager().apply {
  79. setRealm(userRealm)
  80. cacheManager = redisCacheManager
  81. setSessionManager(sessionManager)
  82. }
  83. }
  84. @Bean("shiroFilterRegistrationBean")
  85. @DependsOn("shiroFilter")
  86. fun filterRegistrationBean(): FilterRegistrationBean<DelegatingFilterProxy> {
  87. return FilterRegistrationBean<DelegatingFilterProxy>().apply {
  88. filter = DelegatingFilterProxy("shiroFilter")
  89. isEnabled = true
  90. addUrlPatterns("/*")
  91. setDispatcherTypes(DispatcherType.REQUEST)
  92. }
  93. }
  94. @Bean(name = ["shiroFilter"])
  95. @Order(2)
  96. fun shiroFilter(securityManager: SecurityManager,
  97. config: JwtConfig, jwtRedisCache: JwtRedisCache): ShiroFilterFactoryBean {
  98. return ShiroFilterFactoryBean().apply {
  99. setSecurityManager(securityManager)
  100. filters = hashMapOf<String, Filter>(
  101. "canon" to ZenCorsAnonymousFilter(),
  102. "cors" to ZenCorsPathMatchingFilter(),
  103. "perms" to UrlPermissionsFilter(),
  104. "authc" to AjaxAuthorizationFilter(),
  105. "anon" to AnonymousFilter(),
  106. "jwt" to JwtPathMatchingFilter(config, jwtRedisCache)
  107. )
  108. /**
  109. * anon(匿名) org.apache.shiro.web.filter.authc.AnonymousFilter
  110. * authc(身份验证) org.apache.shiro.web.filter.authc.FormAuthenticationFilter
  111. * authcBasic(http基本验证) org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
  112. * logout(退出) org.apache.shiro.web.filter.authc.LogoutFilter
  113. * noSessionCreation(不创建session) org.apache.shiro.web.filter.session.NoSessionCreationFilter
  114. * perms(许可验证) org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
  115. * port(端口验证) org.apache.shiro.web.filter.authz.PortFilter
  116. * rest (rest方面) org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
  117. * roles(权限验证) org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
  118. * ssl (ssl方面) org.apache.shiro.web.filter.authz.SslFilter
  119. * member (用户方面) org.apache.shiro.web.filter.authc.UserFilter
  120. * user 表示用户不一定已通过认证,只要曾被Shiro记住过登录状态的用户就可以正常发起请求,比如rememberMe
  121. */
  122. filterChainDefinitionMap = linkedMapOf<String, String>( // BUG 此处一定要使用 linkedHashMap 否则顺序有问题
  123. "/auth/setcookie" to "canon", // 设置cookie
  124. "/auth/check" to "canon", // 检查登录状态
  125. "/auth/logout" to "canon", // 登出
  126. "/test/**" to "canon", // 测试 免登录
  127. "/upload/**" to "canon", // 上传免登录
  128. "/fdfsupload/**" to "canon", // 上传免登录
  129. "/api/**" to "canon", // api 免登陆
  130. "/ws/**" to "canon", // websocket 免登陆
  131. "/" to "canon",
  132. "/v1/login/**" to "canon",
  133. ////////////////////// 静态资源 /////////////////////
  134. "/v2/api-docs" to "canon",
  135. "/swagger-resources/**" to "anon",
  136. "/swagger-ui.html" to "anon",
  137. "/webjars*" to "anon",
  138. "/webjars/**" to "anon",
  139. "/druid/**" to "anon",
  140. "/druid/sql.json" to "anon",
  141. "/**/favicon.*" to "anon",
  142. "/eureka*" to "anon",
  143. "/eureka/**" to "anon",
  144. "/v1/sys" to "anon",
  145. ////////////////////// 静态资源 /////////////////////
  146. "/**" to "cors,jwt,authc" // 对于其他未配置的所有url 先设置cors头 再进行登陆判定 最后判定权限
  147. )
  148. }
  149. }
  150. }