ShiroConfig.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package com.bootdo.system.config;
  2. import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
  3. import com.bootdo.common.config.Constant;
  4. import com.bootdo.common.redis.shiro.RedisCacheManager;
  5. import com.bootdo.common.redis.shiro.RedisManager;
  6. import com.bootdo.common.redis.shiro.RedisSessionDAO;
  7. import com.bootdo.system.shiro.SystemShiroFilterFactoryBean;
  8. import com.bootdo.system.shiro.SystemLogoutFilter;
  9. import com.bootdo.system.shiro.UserRealm;
  10. import net.sf.ehcache.CacheManager;
  11. import org.apache.shiro.cache.ehcache.EhCacheManager;
  12. import org.apache.shiro.mgt.SecurityManager;
  13. import org.apache.shiro.session.SessionListener;
  14. import org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler;
  15. import org.apache.shiro.session.mgt.eis.MemorySessionDAO;
  16. import org.apache.shiro.session.mgt.eis.SessionDAO;
  17. import org.apache.shiro.spring.LifecycleBeanPostProcessor;
  18. import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
  19. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  20. import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
  21. import org.springframework.beans.factory.annotation.Value;
  22. import org.springframework.context.annotation.Bean;
  23. import org.springframework.context.annotation.Configuration;
  24. import javax.servlet.Filter;
  25. import java.util.ArrayList;
  26. import java.util.Collection;
  27. import java.util.LinkedHashMap;
  28. import java.util.List;
  29. /**
  30. * @author bootdo 1992lcg@163.com
  31. */
  32. @Configuration
  33. public class ShiroConfig {
  34. @Value("${spring.cache.type}")
  35. private String cacheType ;
  36. @Value("${server.session-timeout}")
  37. private int tomcatTimeout;
  38. @Bean
  39. public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
  40. return new LifecycleBeanPostProcessor();
  41. }
  42. /**
  43. * ShiroDialect,为了在thymeleaf里使用shiro的标签的bean
  44. *
  45. * @return
  46. */
  47. @Bean
  48. public ShiroDialect shiroDialect() {
  49. return new ShiroDialect();
  50. }
  51. /**
  52. * Shiro的Web过滤器
  53. *
  54. * @param securityManager 项目
  55. * @return
  56. */
  57. @Bean
  58. public SystemShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
  59. SystemShiroFilterFactoryBean factory = new SystemShiroFilterFactoryBean();
  60. // 拦截器
  61. LinkedHashMap<String, Filter> filtersMap = new LinkedHashMap<>();
  62. //配置自定义登出 覆盖 logout 之前默认的LogoutFilter
  63. filtersMap.put("logout", shiroLogoutFilter());
  64. factory.setFilters(filtersMap);
  65. factory.setSecurityManager(securityManager);
  66. factory.setLoginUrl("/login");
  67. factory.setSuccessUrl("/index");
  68. factory.setUnauthorizedUrl("/403");
  69. // url过滤规则
  70. LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
  71. filterChainDefinitionMap.put("/getLoginUrl", "anon");
  72. filterChainDefinitionMap.put("/login", "anon");
  73. filterChainDefinitionMap.put("/ssoLogin", "anon");
  74. filterChainDefinitionMap.put("/sys/online/**", "anon");
  75. filterChainDefinitionMap.put("/code", "anon");
  76. filterChainDefinitionMap.put("/sso/**", "anon");
  77. filterChainDefinitionMap.put("/getVerify", "anon");
  78. filterChainDefinitionMap.put("/css/**", "anon");
  79. filterChainDefinitionMap.put("/js/**", "anon");
  80. filterChainDefinitionMap.put("/fonts/**", "anon");
  81. filterChainDefinitionMap.put("/img/**", "anon");
  82. filterChainDefinitionMap.put("/docs/**", "anon");
  83. filterChainDefinitionMap.put("/druid/**", "anon");
  84. filterChainDefinitionMap.put("/upload/**", "anon");
  85. filterChainDefinitionMap.put("/files/**", "anon");
  86. //filterChainDefinitionMap.put("/logout", "logout");
  87. filterChainDefinitionMap.put("/", "anon");
  88. filterChainDefinitionMap.put("/blog", "anon");
  89. filterChainDefinitionMap.put("/blog/open/**", "anon");
  90. filterChainDefinitionMap.put("/sms/**", "anon");
  91. // 门户接口匿名访问
  92. filterChainDefinitionMap.put("/portal/**", "anon");
  93. filterChainDefinitionMap.put("/api/**", "anon");
  94. filterChainDefinitionMap.put("/**", "authc");
  95. factory.setFilterChainDefinitionMap(filterChainDefinitionMap);
  96. // session过滤白名单
  97. List<String> whiteList = new ArrayList<>();
  98. whiteList.add("/code");
  99. factory.setWHITELIST(whiteList);
  100. return factory;
  101. }
  102. @Bean
  103. public SecurityManager securityManager() {
  104. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  105. //设置realm.
  106. securityManager.setRealm(userRealm());
  107. // 自定义缓存实现 使用redis
  108. if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) {
  109. securityManager.setCacheManager(rediscacheManager());
  110. } else {
  111. securityManager.setCacheManager(ehCacheManager());
  112. }
  113. securityManager.setSessionManager(sessionManager());
  114. return securityManager;
  115. }
  116. /**
  117. * 配置LogoutFilter
  118. *
  119. * @return
  120. */
  121. public SystemLogoutFilter shiroLogoutFilter() {
  122. SystemLogoutFilter shiroLogoutFilter = new SystemLogoutFilter();
  123. //配置登出后重定向的地址,等出后配置跳转到登录接口
  124. // shiroLogoutFilter.setRedirectUrl("/login");
  125. return shiroLogoutFilter;
  126. }
  127. @Bean
  128. UserRealm userRealm() {
  129. UserRealm userRealm = new UserRealm();
  130. return userRealm;
  131. }
  132. /**
  133. * 开启shiro aop注解支持.
  134. * 使用代理方式;所以需要开启代码支持;
  135. *
  136. * @param securityManager
  137. * @return
  138. */
  139. @Bean
  140. public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
  141. AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
  142. authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
  143. return authorizationAttributeSourceAdvisor;
  144. }
  145. /**
  146. * 配置shiro redisManager
  147. *
  148. * @return
  149. */
  150. @Bean
  151. public RedisManager redisManager() {
  152. RedisManager redisManager = new RedisManager();
  153. redisManager.setExpire(1800);// 配置缓存过期时间
  154. return redisManager;
  155. }
  156. /**
  157. * cacheManager 缓存 redis实现
  158. * 使用的是shiro-redis开源插件
  159. *
  160. * @return
  161. */
  162. public RedisCacheManager rediscacheManager() {
  163. RedisCacheManager redisCacheManager = new RedisCacheManager();
  164. redisCacheManager.setRedisManager(redisManager());
  165. return redisCacheManager;
  166. }
  167. /**
  168. * RedisSessionDAO shiro sessionDao层的实现 通过redis
  169. * 使用的是shiro-redis开源插件
  170. */
  171. @Bean
  172. public RedisSessionDAO redisSessionDAO() {
  173. RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
  174. redisSessionDAO.setRedisManager(redisManager());
  175. return redisSessionDAO;
  176. }
  177. @Bean
  178. public SessionDAO sessionDAO() {
  179. if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) {
  180. return redisSessionDAO();
  181. } else {
  182. return new MemorySessionDAO();
  183. }
  184. }
  185. /**
  186. * shiro session的管理
  187. */
  188. @Bean
  189. public DefaultWebSessionManager sessionManager() {
  190. DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
  191. // 设置回话过期时间
  192. sessionManager.setGlobalSessionTimeout(tomcatTimeout * 1000L);
  193. // 判定使用内存还是redis
  194. sessionManager.setSessionDAO(sessionDAO());
  195. // 取消登录成功后url 后面的 JSESSIONID
  196. sessionManager.setSessionIdUrlRewritingEnabled(false);
  197. // 删除过期的session
  198. sessionManager.setDeleteInvalidSessions(true);
  199. // 定时检测session过期,90s检测一次
  200. sessionManager.setSessionValidationSchedulerEnabled(true);
  201. ExecutorServiceSessionValidationScheduler validationScheduler = new ExecutorServiceSessionValidationScheduler(
  202. sessionManager);
  203. validationScheduler.setInterval(90000L);
  204. sessionManager.setSessionValidationScheduler(validationScheduler);
  205. Collection<SessionListener> listeners = new ArrayList<SessionListener>();
  206. listeners.add(new BDSessionListener());
  207. sessionManager.setSessionListeners(listeners);
  208. return sessionManager;
  209. }
  210. @Bean
  211. public EhCacheManager ehCacheManager() {
  212. EhCacheManager em = new EhCacheManager();
  213. em.setCacheManager(cacheManager());
  214. return em;
  215. }
  216. @Bean("cacheManager2")
  217. CacheManager cacheManager(){
  218. return CacheManager.create();
  219. }
  220. }