ShiroConfig.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. package com.ruoyi.framework.config;
  2. import java.util.LinkedHashMap;
  3. import java.util.Map;
  4. import javax.servlet.Filter;
  5. import org.apache.shiro.cache.ehcache.EhCacheManager;
  6. import org.apache.shiro.codec.Base64;
  7. import org.apache.shiro.mgt.SecurityManager;
  8. import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
  9. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  10. import org.apache.shiro.web.mgt.CookieRememberMeManager;
  11. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  12. import org.apache.shiro.web.servlet.SimpleCookie;
  13. import org.springframework.beans.factory.annotation.Qualifier;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.context.annotation.Bean;
  16. import org.springframework.context.annotation.Configuration;
  17. import com.ruoyi.common.utils.StringUtils;
  18. import com.ruoyi.framework.shiro.realm.UserRealm;
  19. import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
  20. import com.ruoyi.framework.shiro.session.OnlineSessionFactory;
  21. import com.ruoyi.framework.shiro.web.filter.LogoutFilter;
  22. import com.ruoyi.framework.shiro.web.filter.captcha.CaptchaValidateFilter;
  23. import com.ruoyi.framework.shiro.web.filter.online.OnlineSessionFilter;
  24. import com.ruoyi.framework.shiro.web.filter.sync.SyncOnlineSessionFilter;
  25. import com.ruoyi.framework.shiro.web.session.OnlineWebSessionManager;
  26. import com.ruoyi.framework.shiro.web.session.SpringSessionValidationScheduler;
  27. import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
  28. /**
  29. * 权限配置加载
  30. *
  31. * @author ruoyi
  32. */
  33. @Configuration
  34. public class ShiroConfig
  35. {
  36. public static final String PREMISSION_STRING = "perms[\"{0}\"]";
  37. // Session超时时间,单位为毫秒(默认30分钟)
  38. @Value("${shiro.session.expireTime}")
  39. private int expireTime;
  40. // 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟
  41. @Value("${shiro.session.validationInterval}")
  42. private int validationInterval;
  43. // 验证码开关
  44. @Value("${shiro.user.captchaEbabled}")
  45. private boolean captchaEbabled;
  46. // 验证码类型
  47. @Value("${shiro.user.captchaType}")
  48. private String captchaType;
  49. // 设置Cookie的域名
  50. @Value("${shiro.cookie.domain}")
  51. private String domain;
  52. // 设置cookie的有效访问路径
  53. @Value("${shiro.cookie.path}")
  54. private String path;
  55. // 设置HttpOnly属性
  56. @Value("${shiro.cookie.httpOnly}")
  57. private boolean httpOnly;
  58. // 设置Cookie的过期时间,秒为单位
  59. @Value("${shiro.cookie.maxAge}")
  60. private int maxAge;
  61. // 登录地址
  62. @Value("${shiro.user.loginUrl}")
  63. private String loginUrl;
  64. // 权限认证失败地址
  65. @Value("${shiro.user.unauthorizedUrl}")
  66. private String unauthorizedUrl;
  67. /**
  68. * 缓存管理器 使用Ehcache实现
  69. */
  70. @Bean
  71. public EhCacheManager getEhCacheManager()
  72. {
  73. net.sf.ehcache.CacheManager cacheManager = net.sf.ehcache.CacheManager.getCacheManager("ruoyi");
  74. EhCacheManager em = new EhCacheManager();
  75. if (StringUtils.isNull(cacheManager))
  76. {
  77. em.setCacheManagerConfigFile("classpath:ehcache/ehcache-shiro.xml");
  78. return em;
  79. }
  80. else
  81. {
  82. em.setCacheManager(cacheManager);
  83. return em;
  84. }
  85. }
  86. /**
  87. * 自定义Realm
  88. */
  89. @Bean
  90. public UserRealm userRealm(EhCacheManager cacheManager)
  91. {
  92. UserRealm userRealm = new UserRealm();
  93. userRealm.setCacheManager(cacheManager);
  94. return userRealm;
  95. }
  96. /**
  97. * 自定义sessionDAO会话
  98. */
  99. @Bean
  100. public OnlineSessionDAO sessionDAO()
  101. {
  102. OnlineSessionDAO sessionDAO = new OnlineSessionDAO();
  103. return sessionDAO;
  104. }
  105. /**
  106. * 自定义sessionFactory会话
  107. */
  108. @Bean
  109. public OnlineSessionFactory sessionFactory()
  110. {
  111. OnlineSessionFactory sessionFactory = new OnlineSessionFactory();
  112. return sessionFactory;
  113. }
  114. /**
  115. * 自定义sessionFactory调度器
  116. */
  117. @Bean
  118. public SpringSessionValidationScheduler sessionValidationScheduler()
  119. {
  120. SpringSessionValidationScheduler sessionValidationScheduler = new SpringSessionValidationScheduler();
  121. // 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟
  122. sessionValidationScheduler.setSessionValidationInterval(validationInterval * 60 * 1000);
  123. // 设置会话验证调度器进行会话验证时的会话管理器
  124. sessionValidationScheduler.setSessionManager(sessionValidationManager());
  125. return sessionValidationScheduler;
  126. }
  127. /**
  128. * 会话管理器
  129. */
  130. @Bean
  131. public OnlineWebSessionManager sessionValidationManager()
  132. {
  133. OnlineWebSessionManager manager = new OnlineWebSessionManager();
  134. // 加入缓存管理器
  135. manager.setCacheManager(getEhCacheManager());
  136. // 删除过期的session
  137. manager.setDeleteInvalidSessions(true);
  138. // 设置全局session超时时间
  139. manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
  140. // 去掉 JSESSIONID
  141. manager.setSessionIdUrlRewritingEnabled(false);
  142. // 是否定时检查session
  143. manager.setSessionValidationSchedulerEnabled(true);
  144. // 自定义SessionDao
  145. manager.setSessionDAO(sessionDAO());
  146. // 自定义sessionFactory
  147. manager.setSessionFactory(sessionFactory());
  148. return manager;
  149. }
  150. /**
  151. * 会话管理器
  152. */
  153. @Bean
  154. public OnlineWebSessionManager sessionManager()
  155. {
  156. OnlineWebSessionManager manager = new OnlineWebSessionManager();
  157. // 加入缓存管理器
  158. manager.setCacheManager(getEhCacheManager());
  159. // 删除过期的session
  160. manager.setDeleteInvalidSessions(true);
  161. // 设置全局session超时时间
  162. manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
  163. // 去掉 JSESSIONID
  164. manager.setSessionIdUrlRewritingEnabled(false);
  165. // 定义要使用的无效的Session定时调度器
  166. manager.setSessionValidationScheduler(sessionValidationScheduler());
  167. // 是否定时检查session
  168. manager.setSessionValidationSchedulerEnabled(true);
  169. // 自定义SessionDao
  170. manager.setSessionDAO(sessionDAO());
  171. // 自定义sessionFactory
  172. manager.setSessionFactory(sessionFactory());
  173. return manager;
  174. }
  175. /**
  176. * 安全管理器
  177. */
  178. @Bean
  179. public SecurityManager securityManager(UserRealm userRealm)
  180. {
  181. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  182. // 设置realm.
  183. securityManager.setRealm(userRealm);
  184. // 记住我
  185. securityManager.setRememberMeManager(rememberMeManager());
  186. // 注入缓存管理器;
  187. securityManager.setCacheManager(getEhCacheManager());
  188. // session管理器
  189. securityManager.setSessionManager(sessionManager());
  190. return securityManager;
  191. }
  192. /**
  193. * 退出过滤器
  194. */
  195. public LogoutFilter logoutFilter()
  196. {
  197. LogoutFilter logoutFilter = new LogoutFilter();
  198. logoutFilter.setLoginUrl(loginUrl);
  199. return logoutFilter;
  200. }
  201. /**
  202. * Shiro过滤器配置
  203. */
  204. @Bean
  205. public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)
  206. {
  207. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  208. // Shiro的核心安全接口,这个属性是必须的
  209. shiroFilterFactoryBean.setSecurityManager(securityManager);
  210. // 身份认证失败,则跳转到登录页面的配置
  211. shiroFilterFactoryBean.setLoginUrl(loginUrl);
  212. // 权限认证失败,则跳转到指定页面
  213. shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);
  214. // Shiro连接约束配置,即过滤链的定义
  215. LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
  216. // 对静态资源设置匿名访问
  217. filterChainDefinitionMap.put("/favicon.ico**", "anon");
  218. filterChainDefinitionMap.put("/ruoyi.png**", "anon");
  219. filterChainDefinitionMap.put("/css/**", "anon");
  220. filterChainDefinitionMap.put("/docs/**", "anon");
  221. filterChainDefinitionMap.put("/fonts/**", "anon");
  222. filterChainDefinitionMap.put("/img/**", "anon");
  223. filterChainDefinitionMap.put("/ajax/**", "anon");
  224. filterChainDefinitionMap.put("/js/**", "anon");
  225. filterChainDefinitionMap.put("/ruoyi/**", "anon");
  226. filterChainDefinitionMap.put("/druid/**", "anon");
  227. filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");
  228. // 退出 logout地址,shiro去清除session
  229. filterChainDefinitionMap.put("/logout", "logout");
  230. // 不需要拦截的访问
  231. filterChainDefinitionMap.put("/login", "anon,captchaValidate");
  232. // 系统权限列表
  233. // filterChainDefinitionMap.putAll(SpringUtils.getBean(IMenuService.class).selectPermsAll());
  234. Map<String, Filter> filters = new LinkedHashMap<>();
  235. filters.put("onlineSession", onlineSessionFilter());
  236. filters.put("syncOnlineSession", syncOnlineSessionFilter());
  237. filters.put("captchaValidate", captchaValidateFilter());
  238. // 注销成功,则跳转到指定页面
  239. filters.put("logout", logoutFilter());
  240. shiroFilterFactoryBean.setFilters(filters);
  241. // 所有请求需要认证
  242. filterChainDefinitionMap.put("/**", "user,onlineSession,syncOnlineSession");
  243. shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
  244. return shiroFilterFactoryBean;
  245. }
  246. /**
  247. * 自定义在线用户处理过滤器
  248. */
  249. @Bean
  250. public OnlineSessionFilter onlineSessionFilter()
  251. {
  252. OnlineSessionFilter onlineSessionFilter = new OnlineSessionFilter();
  253. onlineSessionFilter.setLoginUrl(loginUrl);
  254. return onlineSessionFilter;
  255. }
  256. /**
  257. * 自定义在线用户同步过滤器
  258. */
  259. @Bean
  260. public SyncOnlineSessionFilter syncOnlineSessionFilter()
  261. {
  262. SyncOnlineSessionFilter syncOnlineSessionFilter = new SyncOnlineSessionFilter();
  263. return syncOnlineSessionFilter;
  264. }
  265. /**
  266. * 自定义验证码过滤器
  267. */
  268. @Bean
  269. public CaptchaValidateFilter captchaValidateFilter()
  270. {
  271. CaptchaValidateFilter captchaValidateFilter = new CaptchaValidateFilter();
  272. captchaValidateFilter.setCaptchaEbabled(captchaEbabled);
  273. captchaValidateFilter.setCaptchaType(captchaType);
  274. return captchaValidateFilter;
  275. }
  276. /**
  277. * cookie 属性设置
  278. */
  279. public SimpleCookie rememberMeCookie()
  280. {
  281. SimpleCookie cookie = new SimpleCookie("rememberMe");
  282. cookie.setDomain(domain);
  283. cookie.setPath(path);
  284. cookie.setHttpOnly(httpOnly);
  285. cookie.setMaxAge(maxAge * 24 * 60 * 60);
  286. return cookie;
  287. }
  288. /**
  289. * 记住我
  290. */
  291. public CookieRememberMeManager rememberMeManager()
  292. {
  293. CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
  294. cookieRememberMeManager.setCookie(rememberMeCookie());
  295. cookieRememberMeManager.setCipherKey(Base64.decode("fCq+/xW488hMTCD+cmJ3aQ=="));
  296. return cookieRememberMeManager;
  297. }
  298. /**
  299. * thymeleaf模板引擎和shiro框架的整合
  300. */
  301. @Bean
  302. public ShiroDialect shiroDialect()
  303. {
  304. return new ShiroDialect();
  305. }
  306. /**
  307. * 开启Shiro注解通知器
  308. */
  309. @Bean
  310. public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
  311. @Qualifier("securityManager") SecurityManager securityManager)
  312. {
  313. AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
  314. authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
  315. return authorizationAttributeSourceAdvisor;
  316. }
  317. }