ShiroConfig.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  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.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
  14. import org.springframework.beans.factory.annotation.Qualifier;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.context.annotation.Bean;
  17. import org.springframework.context.annotation.Configuration;
  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. EhCacheManager em = new EhCacheManager();
  74. em.setCacheManagerConfigFile("classpath:ehcache/ehcache-shiro.xml");
  75. return em;
  76. }
  77. /**
  78. * 自定义Realm
  79. */
  80. @Bean
  81. public UserRealm userRealm(EhCacheManager cacheManager)
  82. {
  83. UserRealm userRealm = new UserRealm();
  84. userRealm.setCacheManager(cacheManager);
  85. return userRealm;
  86. }
  87. /**
  88. * 自定义sessionDAO会话
  89. */
  90. @Bean
  91. public OnlineSessionDAO sessionDAO()
  92. {
  93. OnlineSessionDAO sessionDAO = new OnlineSessionDAO();
  94. return sessionDAO;
  95. }
  96. /**
  97. * 自定义sessionFactory会话
  98. */
  99. @Bean
  100. public OnlineSessionFactory sessionFactory()
  101. {
  102. OnlineSessionFactory sessionFactory = new OnlineSessionFactory();
  103. return sessionFactory;
  104. }
  105. /**
  106. * 自定义sessionFactory调度器
  107. */
  108. @Bean
  109. public SpringSessionValidationScheduler sessionValidationScheduler()
  110. {
  111. SpringSessionValidationScheduler sessionValidationScheduler = new SpringSessionValidationScheduler();
  112. // 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟
  113. sessionValidationScheduler.setSessionValidationInterval(validationInterval * 60 * 1000);
  114. // 设置会话验证调度器进行会话验证时的会话管理器
  115. sessionValidationScheduler.setSessionManager(sessionValidationManager());
  116. return sessionValidationScheduler;
  117. }
  118. /**
  119. * 会话管理器
  120. */
  121. @Bean
  122. public OnlineWebSessionManager sessionValidationManager()
  123. {
  124. OnlineWebSessionManager manager = new OnlineWebSessionManager();
  125. // 加入缓存管理器
  126. manager.setCacheManager(getEhCacheManager());
  127. // 删除过期的session
  128. manager.setDeleteInvalidSessions(true);
  129. // 设置全局session超时时间
  130. manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
  131. // 去掉 JSESSIONID
  132. manager.setSessionIdUrlRewritingEnabled(false);
  133. // 是否定时检查session
  134. manager.setSessionValidationSchedulerEnabled(true);
  135. // 自定义SessionDao
  136. manager.setSessionDAO(sessionDAO());
  137. // 自定义sessionFactory
  138. manager.setSessionFactory(sessionFactory());
  139. return manager;
  140. }
  141. /**
  142. * 会话管理器
  143. */
  144. @Bean
  145. public OnlineWebSessionManager sessionManager()
  146. {
  147. OnlineWebSessionManager manager = new OnlineWebSessionManager();
  148. // 加入缓存管理器
  149. manager.setCacheManager(getEhCacheManager());
  150. // 删除过期的session
  151. manager.setDeleteInvalidSessions(true);
  152. // 设置全局session超时时间
  153. manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
  154. // 去掉 JSESSIONID
  155. manager.setSessionIdUrlRewritingEnabled(false);
  156. // 定义要使用的无效的Session定时调度器
  157. manager.setSessionValidationScheduler(sessionValidationScheduler());
  158. // 是否定时检查session
  159. manager.setSessionValidationSchedulerEnabled(true);
  160. // 自定义SessionDao
  161. manager.setSessionDAO(sessionDAO());
  162. // 自定义sessionFactory
  163. manager.setSessionFactory(sessionFactory());
  164. return manager;
  165. }
  166. /**
  167. * 安全管理器
  168. */
  169. @Bean
  170. public SecurityManager securityManager(UserRealm userRealm)
  171. {
  172. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  173. // 设置realm.
  174. securityManager.setRealm(userRealm);
  175. // 记住我
  176. securityManager.setRememberMeManager(rememberMeManager());
  177. // 注入缓存管理器;
  178. securityManager.setCacheManager(getEhCacheManager());
  179. // session管理器
  180. securityManager.setSessionManager(sessionManager());
  181. return securityManager;
  182. }
  183. /**
  184. * 退出过滤器
  185. */
  186. public LogoutFilter logoutFilter()
  187. {
  188. LogoutFilter logoutFilter = new LogoutFilter();
  189. logoutFilter.setLoginUrl(loginUrl);
  190. return logoutFilter;
  191. }
  192. /**
  193. * Shiro过滤器配置
  194. */
  195. @Bean
  196. public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)
  197. {
  198. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  199. // Shiro的核心安全接口,这个属性是必须的
  200. shiroFilterFactoryBean.setSecurityManager(securityManager);
  201. // 身份认证失败,则跳转到登录页面的配置
  202. shiroFilterFactoryBean.setLoginUrl(loginUrl);
  203. // 权限认证失败,则跳转到指定页面
  204. shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);
  205. // Shiro连接约束配置,即过滤链的定义
  206. LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
  207. // 对静态资源设置匿名访问
  208. filterChainDefinitionMap.put("/favicon.ico**", "anon");
  209. filterChainDefinitionMap.put("/ruoyi.png**", "anon");
  210. filterChainDefinitionMap.put("/css/**", "anon");
  211. filterChainDefinitionMap.put("/docs/**", "anon");
  212. filterChainDefinitionMap.put("/fonts/**", "anon");
  213. filterChainDefinitionMap.put("/img/**", "anon");
  214. filterChainDefinitionMap.put("/ajax/**", "anon");
  215. filterChainDefinitionMap.put("/js/**", "anon");
  216. filterChainDefinitionMap.put("/ruoyi/**", "anon");
  217. filterChainDefinitionMap.put("/druid/**", "anon");
  218. filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");
  219. // 退出 logout地址,shiro去清除session
  220. filterChainDefinitionMap.put("/logout", "logout");
  221. // 不需要拦截的访问
  222. filterChainDefinitionMap.put("/login", "anon,captchaValidate");
  223. // 系统权限列表
  224. // filterChainDefinitionMap.putAll(SpringUtils.getBean(IMenuService.class).selectPermsAll());
  225. Map<String, Filter> filters = new LinkedHashMap<>();
  226. filters.put("onlineSession", onlineSessionFilter());
  227. filters.put("syncOnlineSession", syncOnlineSessionFilter());
  228. filters.put("captchaValidate", captchaValidateFilter());
  229. // 注销成功,则跳转到指定页面
  230. filters.put("logout", logoutFilter());
  231. shiroFilterFactoryBean.setFilters(filters);
  232. // 所有请求需要认证
  233. filterChainDefinitionMap.put("/**", "user");
  234. // 系统请求记录当前会话
  235. filterChainDefinitionMap.put("/main", "onlineSession,syncOnlineSession");
  236. filterChainDefinitionMap.put("/system/**", "onlineSession,syncOnlineSession");
  237. filterChainDefinitionMap.put("/monitor/**", "onlineSession,syncOnlineSession");
  238. filterChainDefinitionMap.put("/tool/**", "onlineSession,syncOnlineSession");
  239. shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
  240. return shiroFilterFactoryBean;
  241. }
  242. /**
  243. * 自定义在线用户处理过滤器
  244. */
  245. @Bean
  246. public OnlineSessionFilter onlineSessionFilter()
  247. {
  248. OnlineSessionFilter onlineSessionFilter = new OnlineSessionFilter();
  249. onlineSessionFilter.setLoginUrl(loginUrl);
  250. return onlineSessionFilter;
  251. }
  252. /**
  253. * 自定义在线用户同步过滤器
  254. */
  255. @Bean
  256. public SyncOnlineSessionFilter syncOnlineSessionFilter()
  257. {
  258. SyncOnlineSessionFilter syncOnlineSessionFilter = new SyncOnlineSessionFilter();
  259. return syncOnlineSessionFilter;
  260. }
  261. /**
  262. * 自定义验证码过滤器
  263. */
  264. @Bean
  265. public CaptchaValidateFilter captchaValidateFilter()
  266. {
  267. CaptchaValidateFilter captchaValidateFilter = new CaptchaValidateFilter();
  268. captchaValidateFilter.setCaptchaEbabled(captchaEbabled);
  269. captchaValidateFilter.setCaptchaType(captchaType);
  270. return captchaValidateFilter;
  271. }
  272. /**
  273. * cookie 属性设置
  274. */
  275. public SimpleCookie rememberMeCookie()
  276. {
  277. SimpleCookie cookie = new SimpleCookie("rememberMe");
  278. cookie.setDomain(domain);
  279. cookie.setPath(path);
  280. cookie.setHttpOnly(httpOnly);
  281. cookie.setMaxAge(maxAge * 24 * 60 * 60);
  282. return cookie;
  283. }
  284. /**
  285. * 记住我
  286. */
  287. public CookieRememberMeManager rememberMeManager()
  288. {
  289. CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
  290. cookieRememberMeManager.setCookie(rememberMeCookie());
  291. cookieRememberMeManager.setCipherKey(Base64.decode("fCq+/xW488hMTCD+cmJ3aQ=="));
  292. return cookieRememberMeManager;
  293. }
  294. /**
  295. * 开启Shiro代理
  296. */
  297. @Bean
  298. public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator()
  299. {
  300. DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
  301. proxyCreator.setProxyTargetClass(true);
  302. return proxyCreator;
  303. }
  304. /**
  305. * thymeleaf模板引擎和shiro框架的整合
  306. */
  307. @Bean
  308. public ShiroDialect shiroDialect()
  309. {
  310. return new ShiroDialect();
  311. }
  312. /**
  313. * 开启Shiro注解通知器
  314. */
  315. @Bean
  316. public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
  317. @Qualifier("securityManager") SecurityManager securityManager)
  318. {
  319. AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
  320. authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
  321. return authorizationAttributeSourceAdvisor;
  322. }
  323. }