123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- package com.ruoyi.framework.config;
- import java.util.LinkedHashMap;
- import java.util.Map;
- import javax.servlet.Filter;
- import org.apache.shiro.cache.ehcache.EhCacheManager;
- import org.apache.shiro.codec.Base64;
- import org.apache.shiro.mgt.SecurityManager;
- import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
- import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
- import org.apache.shiro.web.mgt.CookieRememberMeManager;
- import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
- import org.apache.shiro.web.servlet.SimpleCookie;
- import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import com.ruoyi.common.utils.StringUtils;
- import com.ruoyi.framework.shiro.realm.UserRealm;
- import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
- import com.ruoyi.framework.shiro.session.OnlineSessionFactory;
- import com.ruoyi.framework.shiro.web.filter.LogoutFilter;
- import com.ruoyi.framework.shiro.web.filter.captcha.CaptchaValidateFilter;
- import com.ruoyi.framework.shiro.web.filter.online.OnlineSessionFilter;
- import com.ruoyi.framework.shiro.web.filter.sync.SyncOnlineSessionFilter;
- import com.ruoyi.framework.shiro.web.session.OnlineWebSessionManager;
- import com.ruoyi.framework.shiro.web.session.SpringSessionValidationScheduler;
- import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
- /**
- * 权限配置加载
- *
- * @author ruoyi
- */
- @Configuration
- public class ShiroConfig
- {
- public static final String PREMISSION_STRING = "perms[\"{0}\"]";
- // Session超时时间,单位为毫秒(默认30分钟)
- @Value("${shiro.session.expireTime}")
- private int expireTime;
- // 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟
- @Value("${shiro.session.validationInterval}")
- private int validationInterval;
- // 验证码开关
- @Value("${shiro.user.captchaEbabled}")
- private boolean captchaEbabled;
- // 验证码类型
- @Value("${shiro.user.captchaType}")
- private String captchaType;
- // 设置Cookie的域名
- @Value("${shiro.cookie.domain}")
- private String domain;
- // 设置cookie的有效访问路径
- @Value("${shiro.cookie.path}")
- private String path;
- // 设置HttpOnly属性
- @Value("${shiro.cookie.httpOnly}")
- private boolean httpOnly;
- // 设置Cookie的过期时间,秒为单位
- @Value("${shiro.cookie.maxAge}")
- private int maxAge;
- // 登录地址
- @Value("${shiro.user.loginUrl}")
- private String loginUrl;
- // 权限认证失败地址
- @Value("${shiro.user.unauthorizedUrl}")
- private String unauthorizedUrl;
- /**
- * 缓存管理器 使用Ehcache实现
- */
- @Bean
- public EhCacheManager getEhCacheManager()
- {
- net.sf.ehcache.CacheManager cacheManager = net.sf.ehcache.CacheManager.getCacheManager("ruoyi");
- EhCacheManager em = new EhCacheManager();
- if (StringUtils.isNull(cacheManager))
- {
- em.setCacheManagerConfigFile("classpath:ehcache/ehcache-shiro.xml");
- return em;
- }
- else
- {
- em.setCacheManager(cacheManager);
- return em;
- }
- }
- /**
- * 自定义Realm
- */
- @Bean
- public UserRealm userRealm(EhCacheManager cacheManager)
- {
- UserRealm userRealm = new UserRealm();
- userRealm.setCacheManager(cacheManager);
- return userRealm;
- }
- /**
- * 自定义sessionDAO会话
- */
- @Bean
- public OnlineSessionDAO sessionDAO()
- {
- OnlineSessionDAO sessionDAO = new OnlineSessionDAO();
- return sessionDAO;
- }
- /**
- * 自定义sessionFactory会话
- */
- @Bean
- public OnlineSessionFactory sessionFactory()
- {
- OnlineSessionFactory sessionFactory = new OnlineSessionFactory();
- return sessionFactory;
- }
- /**
- * 自定义sessionFactory调度器
- */
- @Bean
- public SpringSessionValidationScheduler sessionValidationScheduler()
- {
- SpringSessionValidationScheduler sessionValidationScheduler = new SpringSessionValidationScheduler();
- // 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟
- sessionValidationScheduler.setSessionValidationInterval(validationInterval * 60 * 1000);
- // 设置会话验证调度器进行会话验证时的会话管理器
- sessionValidationScheduler.setSessionManager(sessionValidationManager());
- return sessionValidationScheduler;
- }
- /**
- * 会话管理器
- */
- @Bean
- public OnlineWebSessionManager sessionValidationManager()
- {
- OnlineWebSessionManager manager = new OnlineWebSessionManager();
- // 加入缓存管理器
- manager.setCacheManager(getEhCacheManager());
- // 删除过期的session
- manager.setDeleteInvalidSessions(true);
- // 设置全局session超时时间
- manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
- // 去掉 JSESSIONID
- manager.setSessionIdUrlRewritingEnabled(false);
- // 是否定时检查session
- manager.setSessionValidationSchedulerEnabled(true);
- // 自定义SessionDao
- manager.setSessionDAO(sessionDAO());
- // 自定义sessionFactory
- manager.setSessionFactory(sessionFactory());
- return manager;
- }
- /**
- * 会话管理器
- */
- @Bean
- public OnlineWebSessionManager sessionManager()
- {
- OnlineWebSessionManager manager = new OnlineWebSessionManager();
- // 加入缓存管理器
- manager.setCacheManager(getEhCacheManager());
- // 删除过期的session
- manager.setDeleteInvalidSessions(true);
- // 设置全局session超时时间
- manager.setGlobalSessionTimeout(expireTime * 60 * 1000);
- // 去掉 JSESSIONID
- manager.setSessionIdUrlRewritingEnabled(false);
- // 定义要使用的无效的Session定时调度器
- manager.setSessionValidationScheduler(sessionValidationScheduler());
- // 是否定时检查session
- manager.setSessionValidationSchedulerEnabled(true);
- // 自定义SessionDao
- manager.setSessionDAO(sessionDAO());
- // 自定义sessionFactory
- manager.setSessionFactory(sessionFactory());
- return manager;
- }
- /**
- * 安全管理器
- */
- @Bean
- public SecurityManager securityManager(UserRealm userRealm)
- {
- DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
- // 设置realm.
- securityManager.setRealm(userRealm);
- // 记住我
- securityManager.setRememberMeManager(rememberMeManager());
- // 注入缓存管理器;
- securityManager.setCacheManager(getEhCacheManager());
- // session管理器
- securityManager.setSessionManager(sessionManager());
- return securityManager;
- }
- /**
- * 退出过滤器
- */
- public LogoutFilter logoutFilter()
- {
- LogoutFilter logoutFilter = new LogoutFilter();
- logoutFilter.setLoginUrl(loginUrl);
- return logoutFilter;
- }
- /**
- * Shiro过滤器配置
- */
- @Bean
- public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)
- {
- ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
- // Shiro的核心安全接口,这个属性是必须的
- shiroFilterFactoryBean.setSecurityManager(securityManager);
- // 身份认证失败,则跳转到登录页面的配置
- shiroFilterFactoryBean.setLoginUrl(loginUrl);
- // 权限认证失败,则跳转到指定页面
- shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);
- // Shiro连接约束配置,即过滤链的定义
- LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
- // 对静态资源设置匿名访问
- filterChainDefinitionMap.put("/favicon.ico**", "anon");
- filterChainDefinitionMap.put("/ruoyi.png**", "anon");
- filterChainDefinitionMap.put("/css/**", "anon");
- filterChainDefinitionMap.put("/docs/**", "anon");
- filterChainDefinitionMap.put("/fonts/**", "anon");
- filterChainDefinitionMap.put("/img/**", "anon");
- filterChainDefinitionMap.put("/ajax/**", "anon");
- filterChainDefinitionMap.put("/js/**", "anon");
- filterChainDefinitionMap.put("/ruoyi/**", "anon");
- filterChainDefinitionMap.put("/druid/**", "anon");
- filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");
- // 退出 logout地址,shiro去清除session
- filterChainDefinitionMap.put("/logout", "logout");
- // 不需要拦截的访问
- filterChainDefinitionMap.put("/login", "anon,captchaValidate");
- // 系统权限列表
- // filterChainDefinitionMap.putAll(SpringUtils.getBean(IMenuService.class).selectPermsAll());
- Map<String, Filter> filters = new LinkedHashMap<>();
- filters.put("onlineSession", onlineSessionFilter());
- filters.put("syncOnlineSession", syncOnlineSessionFilter());
- filters.put("captchaValidate", captchaValidateFilter());
- // 注销成功,则跳转到指定页面
- filters.put("logout", logoutFilter());
- shiroFilterFactoryBean.setFilters(filters);
- // 所有请求需要认证
- filterChainDefinitionMap.put("/**", "user");
- // 系统请求记录当前会话
- filterChainDefinitionMap.put("/main", "onlineSession,syncOnlineSession");
- filterChainDefinitionMap.put("/system/**", "onlineSession,syncOnlineSession");
- filterChainDefinitionMap.put("/monitor/**", "onlineSession,syncOnlineSession");
- filterChainDefinitionMap.put("/tool/**", "onlineSession,syncOnlineSession");
- shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
- return shiroFilterFactoryBean;
- }
- /**
- * 自定义在线用户处理过滤器
- */
- @Bean
- public OnlineSessionFilter onlineSessionFilter()
- {
- OnlineSessionFilter onlineSessionFilter = new OnlineSessionFilter();
- onlineSessionFilter.setLoginUrl(loginUrl);
- return onlineSessionFilter;
- }
- /**
- * 自定义在线用户同步过滤器
- */
- @Bean
- public SyncOnlineSessionFilter syncOnlineSessionFilter()
- {
- SyncOnlineSessionFilter syncOnlineSessionFilter = new SyncOnlineSessionFilter();
- return syncOnlineSessionFilter;
- }
- /**
- * 自定义验证码过滤器
- */
- @Bean
- public CaptchaValidateFilter captchaValidateFilter()
- {
- CaptchaValidateFilter captchaValidateFilter = new CaptchaValidateFilter();
- captchaValidateFilter.setCaptchaEbabled(captchaEbabled);
- captchaValidateFilter.setCaptchaType(captchaType);
- return captchaValidateFilter;
- }
- /**
- * cookie 属性设置
- */
- public SimpleCookie rememberMeCookie()
- {
- SimpleCookie cookie = new SimpleCookie("rememberMe");
- cookie.setDomain(domain);
- cookie.setPath(path);
- cookie.setHttpOnly(httpOnly);
- cookie.setMaxAge(maxAge * 24 * 60 * 60);
- return cookie;
- }
- /**
- * 记住我
- */
- public CookieRememberMeManager rememberMeManager()
- {
- CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
- cookieRememberMeManager.setCookie(rememberMeCookie());
- cookieRememberMeManager.setCipherKey(Base64.decode("fCq+/xW488hMTCD+cmJ3aQ=="));
- return cookieRememberMeManager;
- }
- /**
- * 开启Shiro代理
- */
- @Bean
- public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator()
- {
- DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
- proxyCreator.setProxyTargetClass(true);
- return proxyCreator;
- }
- /**
- * thymeleaf模板引擎和shiro框架的整合
- */
- @Bean
- public ShiroDialect shiroDialect()
- {
- return new ShiroDialect();
- }
- /**
- * 开启Shiro注解通知器
- */
- @Bean
- public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(
- @Qualifier("securityManager") SecurityManager securityManager)
- {
- AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
- authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
- return authorizationAttributeSourceAdvisor;
- }
- }
|