diff --git a/boot-web/pom.xml b/boot-web/pom.xml index 4df0510..858ba3a 100644 --- a/boot-web/pom.xml +++ b/boot-web/pom.xml @@ -58,6 +58,10 @@ + + org.springframework + spring-context-support + org.springframework.boot @@ -81,16 +85,11 @@ commons-fileupload ${fileUpLoad.version} - + org.crazycake shiro-redis - 1.1.0-RELEASE - - - org.apache.shiro - shiro-quartz - 1.2.3 + 2.4.2.1-RELEASE diff --git a/boot-web/src/main/java/com/xwbing/shiro/FormAuthenticationCaptchaFilter.java b/boot-web/src/main/java/com/xwbing/shiro/FormAuthenticationCaptchaFilter.java deleted file mode 100644 index 7666f9c..0000000 --- a/boot-web/src/main/java/com/xwbing/shiro/FormAuthenticationCaptchaFilter.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.xwbing.shiro; - -import org.apache.shiro.authc.AuthenticationToken; -import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; -import org.apache.shiro.web.util.WebUtils; - -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; - -/** - * 项目名称: boot-module-demo - * 创建时间: 2018/3/29 15:28 - * 作者: xiangwb - * 说明: - */ -public class FormAuthenticationCaptchaFilter extends FormAuthenticationFilter { - public static final String DEFAULT_CAPTCHA_PARAM = "captcha_code"; - private String captchaParam = DEFAULT_CAPTCHA_PARAM; - - public String getCaptchaParam() { - return captchaParam; - } - - protected String getCaptcha(ServletRequest request) { - return WebUtils.getCleanParam(request, getCaptchaParam()); - - } - - @Override - protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) { - String username = getUsername(request); - String password = getPassword(request); - String captcha = getCaptcha(request); - boolean rememberMe = isRememberMe(request); - String host = getHost(request); - return new UsernamePasswordCaptchaToken(username, password.toCharArray(), rememberMe, host, captcha); - } -} diff --git a/boot-web/src/main/java/com/xwbing/shiro/MySessionManager.java b/boot-web/src/main/java/com/xwbing/shiro/MySessionManager.java deleted file mode 100644 index badc557..0000000 --- a/boot-web/src/main/java/com/xwbing/shiro/MySessionManager.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.xwbing.shiro; - -import org.apache.commons.lang3.StringUtils; -import org.apache.shiro.web.servlet.ShiroHttpServletRequest; -import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; -import org.apache.shiro.web.util.WebUtils; - -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import java.io.Serializable; - -/** - * 项目名称: boot-module-demo - * 创建时间: 2018/3/29 16:29 - * 作者: xiangwb - * 说明: 自定义sessionId获取 - */ -public class MySessionManager extends DefaultWebSessionManager { - private static final String AUTHORIZATION = "Authorization"; - - private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request"; - - public MySessionManager() { - super(); - } - - @Override - protected Serializable getSessionId(ServletRequest request, ServletResponse response) { - String id = WebUtils.toHttp(request).getHeader(AUTHORIZATION); - //如果请求头中有 Authorization 则其值为sessionId - if (StringUtils.isNotEmpty(id)) { - request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE); - request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id); - request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE); - return id; - } else { - //否则按默认规则从cookie取sessionId - return super.getSessionId(request, response); - } - } -} diff --git a/boot-web/src/main/java/com/xwbing/shiro/MyShiroRealm.java b/boot-web/src/main/java/com/xwbing/shiro/MyShiroRealm.java index d717ec8..087ed75 100644 --- a/boot-web/src/main/java/com/xwbing/shiro/MyShiroRealm.java +++ b/boot-web/src/main/java/com/xwbing/shiro/MyShiroRealm.java @@ -8,6 +8,8 @@ import com.xwbing.service.sys.SysAuthorityService; import com.xwbing.service.sys.SysRoleService; import com.xwbing.service.sys.SysUserService; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; @@ -90,11 +92,11 @@ public class MyShiroRealm extends AuthorizingRealm { protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) { UsernamePasswordCaptchaToken captchaToken = (UsernamePasswordCaptchaToken) authenticationToken; //1.校验验证码 -// String captcha = captchaToken.getCaptcha(); -// String imgCode = (String) SecurityUtils.getSubject().getSession().getAttribute(CommonConstant.KEY_CAPTCHA); -// if (StringUtils.isEmpty(captcha) || !captcha.equalsIgnoreCase(imgCode)) { -// throw new AuthenticationException("验证码错误"); -// } + String captcha = captchaToken.getCaptcha(); + String imgCode = (String) SecurityUtils.getSubject().getSession().getAttribute(CommonConstant.KEY_CAPTCHA); + if (StringUtils.isEmpty(captcha) || !captcha.equalsIgnoreCase(imgCode)) { + throw new AuthenticationException("验证码错误"); + } //2.查是否有此用户 SysUser user = sysUserService.getByUserName(captchaToken.getUsername()); if (user == null) { diff --git a/boot-web/src/main/java/com/xwbing/shiro/ShiroConfig.java b/boot-web/src/main/java/com/xwbing/shiro/ShiroConfig.java index 756250a..d6e9388 100644 --- a/boot-web/src/main/java/com/xwbing/shiro/ShiroConfig.java +++ b/boot-web/src/main/java/com/xwbing/shiro/ShiroConfig.java @@ -8,7 +8,13 @@ import org.apache.shiro.web.filter.authc.AnonymousFilter; import org.apache.shiro.web.mgt.CookieRememberMeManager; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.servlet.SimpleCookie; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.crazycake.shiro.RedisCacheManager; +import org.crazycake.shiro.RedisManager; +import org.crazycake.shiro.RedisSessionDAO; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,18 +36,14 @@ import java.util.Map; * 说明: anon,authc */ @Configuration -@PropertySource("classpath:shiro.properties") +@PropertySource("classpath:redis.properties") public class ShiroConfig { - @Value("${rememberMeCookieMaxAge}") - private Integer rememberMeCookieMaxAge; - @Value("${globalSessionTimeout}") - private Long globalSessionTimeout; - @Value("${sessionValidationInterval}") - private String sessionValidationInterval; - @Value("${sessionsCacheName}") - private String sessionsCacheName; - @Value("${sessionIdCookieName}") - private String sessionIdCookieName; + @Value("${host}") + private String host; + @Value("${port}") + private Integer port; + @Value("${timeout}") + private Integer timeOut; /** * 此处核心,对多个filter进行管理,其它filer设置不自动加载,作为过滤链条使用 @@ -98,89 +100,68 @@ public class ShiroConfig { //登出 chains.put("/user/logout", "anon"); //必须通过验证或者rememberMe - chains.put("/**", "user,authc"); + chains.put("/**", "user,authc,sessionFilter"); shiroFilterFactoryBean.setFilterChainDefinitionMap(chains); return shiroFilterFactoryBean; } - /////////////////securityManager/////////////////// + ///////////////////////securityManager/////////////////// @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(shiroRealm()); -// securityManager.setCacheManager(cacheManager()); -// securityManager.setSessionManager(defaultWebSessionManager()); + securityManager.setCacheManager(cacheManager()); + securityManager.setSessionManager(sessionManager()); securityManager.setRememberMeManager(rememberMeManager()); return securityManager; } - ///////////////////shiroRealm/////////////////// + ///////////////////////shiroRealm/////////////////// @Bean - @DependsOn(value = "lifecycleBeanPostProcessor") + @DependsOn("lifecycleBeanPostProcessor") public MyShiroRealm shiroRealm() { MyShiroRealm myShiroRealm = new MyShiroRealm(); -// myShiroRealm.setCacheManager(cacheManager()); + myShiroRealm.setCacheManager(cacheManager()); myShiroRealm.setAuthorizationCachingEnabled(false); -// //启用身份验证缓存,即缓存AuthenticationInfo信息,默认false -// myShiroRealm.setAuthenticationCachingEnabled(true); -// //缓存AuthenticationInfo信息的缓存名称 -// myShiroRealm.setAuthenticationCacheName("authenticationCache"); -// //缓存AuthorizationInfo信息的缓存名称 -// myShiroRealm.setAuthorizationCacheName("authorizationCache"); return myShiroRealm; } - ///////////////////cacheManager//////////////// -// @Bean -// public RedisCacheManager cacheManager() { -// RedisManager redisManager = new RedisManager(); -// redisManager.setExpire(333333333); -// redisManager.setHost("192.168.11.202"); -// redisManager.setPort(6379); -// RedisCacheManager cacheManager = new RedisCacheManager(); -// cacheManager.setRedisManager(redisManager); -// return cacheManager; -// } -// //////////////////////sessionManager////////////////// -// -// @Bean -// public SessionManager defaultWebSessionManager() { -// DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); -// sessionManager.setCacheManager(cacheManager()); -// sessionManager.setGlobalSessionTimeout(globalSessionTimeout); -// sessionManager.setDeleteInvalidSessions(true); -// sessionManager.setSessionValidationSchedulerEnabled(true); -// sessionManager.setDeleteInvalidSessions(true); -//// sessionManager.setSessionValidationScheduler(sessionValidationScheduler()); -// sessionManager.setSessionIdCookie(sessionIdCookie()); -// sessionManager.setSessionIdCookieEnabled(true); -// sessionManager.setSessionDAO(sessionDAO()); -// return sessionManager; -// } -// -// @Bean -// public SimpleCookie sessionIdCookie() { -// SimpleCookie simpleCookie = new SimpleCookie(sessionIdCookieName); -// simpleCookie.setHttpOnly(true); -// simpleCookie.setMaxAge(-1);// -// return simpleCookie; -// } -// -// @Bean -// public EnterpriseCacheSessionDAO sessionDAO() { -// EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO(); -// sessionDAO.setActiveSessionsCacheName("shiro-activeSessionCache"); -// sessionDAO.setSessionIdGenerator(new JavaUuidSessionIdGenerator()); -// return sessionDAO; -// } + ///////////////////////redisManager/////////////////// + @Bean + public RedisManager redisManager() { + RedisManager redisManager = new RedisManager(); + redisManager.setHost("192.168.11.202"); + redisManager.setPort(6379); + redisManager.setExpire(1800);//配置缓存过期时间 + redisManager.setTimeout(10000); + return redisManager; + } - //////////////rememberMeManager////////////////// + ///////////////////////cacheManager/////////////////// + @Bean + @DependsOn("lifecycleBeanPostProcessor") + public RedisCacheManager cacheManager() { + RedisCacheManager redisCacheManager = new RedisCacheManager(); + redisCacheManager.setRedisManager(redisManager()); + return redisCacheManager; + } - /** - * cookie管理对象,记住我功能 - * - * @return - */ + ///////////////////////sessionManager/////////////////// + @Bean + public DefaultWebSessionManager sessionManager() { + DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); + sessionManager.setSessionDAO(redisSessionDAO()); + return sessionManager; + } + + @Bean + public RedisSessionDAO redisSessionDAO() { + RedisSessionDAO redisSessionDAO = new RedisSessionDAO(); + redisSessionDAO.setRedisManager(redisManager()); + return redisSessionDAO; + } + + ///////////////////////rememberMeManager/////////////////// @Bean public CookieRememberMeManager rememberMeManager() { CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); @@ -190,11 +171,6 @@ public class ShiroConfig { return cookieRememberMeManager; } - /** - * cookie对象; - * - * @return - */ @Bean public SimpleCookie rememberMeCookie() { //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe @@ -204,7 +180,7 @@ public class ShiroConfig { return simpleCookie; } - /////////////////////////urlPermissionsFilter////////////////// + ///////////////////////urlPermissionsFilter/////////////////// @Bean public FilterRegistrationBean urlPermissionsFilterRegistrationBean(UrlPermissionsFilter urlPermissionsFilter) { FilterRegistrationBean registration = new FilterRegistrationBean(urlPermissionsFilter); @@ -218,14 +194,18 @@ public class ShiroConfig { return new UrlPermissionsFilter(); } - /////////////////////sessionFilter////////////////////////////////////// + /** + * session超时过滤 + * + * @return + */ @Bean(name = "sessionFilter") public SessionFilter sessionFilter() { return new SessionFilter(); } /** - * 保证实现了Shiro内部lifecycle函数的bean执行 Shiro生命周期处理器 + * Shiro生命周期处理器 * * @return */ @@ -234,6 +214,7 @@ public class ShiroConfig { return new LifecycleBeanPostProcessor(); } + /** * AOP式方法级权限检查 * @@ -246,4 +227,15 @@ public class ShiroConfig { authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); return authorizationAttributeSourceAdvisor; } + + /** + * Spring的一个bean,由Advisor决定对哪些类的方法进行AOP代理。 + */ + @Bean + @ConditionalOnMissingBean + public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { + DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator(); + defaultAAP.setProxyTargetClass(true); + return defaultAAP; + } } diff --git a/boot-web/src/main/resources/shiro.properties b/boot-web/src/main/resources/shiro.properties deleted file mode 100644 index 49c04a9..0000000 --- a/boot-web/src/main/resources/shiro.properties +++ /dev/null @@ -1,7 +0,0 @@ -### s -rememberMeCookieMaxAge=604800 -globalSessionTimeout=1800000 -sessionValidationInterval=60000 -sessionsCacheName=shiro-activeSessionCache -sessionIdCookieName=drore.session.ywjpjScenic.id -path=/ \ No newline at end of file