This commit is contained in:
xiangwb
2018-04-03 17:57:54 +08:00
parent 9f383fd49f
commit 3ca8e1eccd
6 changed files with 86 additions and 179 deletions
+6 -7
View File
@@ -58,6 +58,10 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
@@ -81,16 +85,11 @@
<artifactId>commons-fileupload</artifactId>
<version>${fileUpLoad.version}</version>
</dependency>
<!-- shiro-->
<!-- shiro-redis-->
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis</artifactId>
<version>1.1.0-RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-quartz</artifactId>
<version>1.2.3</version>
<version>2.4.2.1-RELEASE</version>
</dependency>
</dependencies>
<build>
@@ -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);
}
}
@@ -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);
}
}
}
@@ -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) {
@@ -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);//<!-- maxAge=-1表示浏览器关闭时失效此Cookie; -->
// 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;
}
}
@@ -1,7 +0,0 @@
### s
rememberMeCookieMaxAge=604800
globalSessionTimeout=1800000
sessionValidationInterval=60000
sessionsCacheName=shiro-activeSessionCache
sessionIdCookieName=drore.session.ywjpjScenic.id
path=/