添加验证码拦截url可配置,验证码生成参数可增量开发
This commit is contained in:
@@ -3,4 +3,6 @@
|
||||
##相关配置参数说明
|
||||
- `ms.security.browser.html` 自定义登录页面的地址
|
||||
- `ms.security.browser.loginType` 身份认证后响应类型`REDIRECT`页面形式响应
|
||||
`JSON` json形式的响应
|
||||
`JSON` json形式的响应
|
||||
- 定义自己的根据用户名获取密码的bean,定义自己的bean的名字为`userServiceImpl`即可
|
||||
- `/authentication/require`处理身份认证跳转的接口地址
|
||||
+2
@@ -60,6 +60,8 @@ public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
|
||||
//创建自定义的验证码过滤器,填入身份认证失败处理对象
|
||||
ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter();
|
||||
validateCodeFilter.setAuthenticationFailureHandler(msAuthenticationFailureHandler);
|
||||
validateCodeFilter.setSecurityProperties(securityProperties);
|
||||
validateCodeFilter.afterPropertiesSet();
|
||||
http
|
||||
.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)//添加自定义的验证码处理器,在用户密码校验过滤器之前
|
||||
.formLogin()//使用表单登录
|
||||
|
||||
@@ -3,8 +3,12 @@
|
||||
##本项目的参数配置说明
|
||||
本项目说明中的配置参数是boot-starter-security-browser和boot-starter-security-app
|
||||
项目的交集
|
||||
- 用户登录接口url`/user/login`
|
||||
- 验证码获取接口url`/code/image`
|
||||
- `ms.security.code.image.width` 图片验证码宽度,默认值是`67` 可以在请求中使用`width`参数设置
|
||||
- `ms.security.code.image.height`图片验证码高度,默认值是`23` 可以在请求中使用`height`参数设置
|
||||
- `ms.security.code.image.length`图片验证码的code长度,默认是`4` 不能在请求中设置
|
||||
- `ms.security.code.image.expireIn` 图片验证码的有效时间`60`秒 不能在请求中设置
|
||||
- `ms.security.code.image.url` 需要进行验证码校验的地址,默认值是`/user/login` 可以是`/user/*`这种格式,多个适用,号分割 不能在请求中设置
|
||||
- 本着增量开发的原则,可以实现`ValicateCodeUtil`生成验证码的方法,并定义名称为`validateCodeUtil`的bean便可替换原有的验证码的生成逻辑
|
||||
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package com.micro.fast.security.core.config;
|
||||
|
||||
import com.micro.fast.security.core.config.param.SecurityProperties;
|
||||
import com.micro.fast.security.core.util.ImageCodeUtil;
|
||||
import com.micro.fast.security.core.util.ValidateCodeUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* 验证码实现类的配置
|
||||
*/
|
||||
@Configuration
|
||||
public class ValidateCodeUtilBean {
|
||||
|
||||
@Autowired
|
||||
private SecurityProperties securityProperties;
|
||||
|
||||
/**
|
||||
* 增量开发,在保持原有代码逻辑不变的基础之上添加新的方法进行替换
|
||||
* @return
|
||||
*/
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(name = "validateCodeUtil")
|
||||
public ValidateCodeUtil validateCodeUtil(){
|
||||
ImageCodeUtil imageCodeUtil = new ImageCodeUtil();
|
||||
imageCodeUtil.setSecurityProperties(securityProperties);
|
||||
return imageCodeUtil;
|
||||
}
|
||||
}
|
||||
+13
@@ -21,6 +21,11 @@ public class ImageCodeProperties {
|
||||
*/
|
||||
private int expireIn = 60;
|
||||
|
||||
/**
|
||||
* 需要进行验证码校验的url
|
||||
*/
|
||||
private String url = "/user/login";
|
||||
|
||||
public int getWidth() {
|
||||
return width;
|
||||
}
|
||||
@@ -52,4 +57,12 @@ public class ImageCodeProperties {
|
||||
public void setExpireIn(int expireIn) {
|
||||
this.expireIn = expireIn;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -2,9 +2,9 @@ package com.micro.fast.security.core.controller;
|
||||
|
||||
import com.micro.fast.security.core.config.param.SecurityProperties;
|
||||
import com.micro.fast.security.core.constant.ValidateCodeConst;
|
||||
import com.micro.fast.security.core.pojo.ValidateCode;
|
||||
import com.micro.fast.security.core.util.ImageCodeUtil;
|
||||
import com.micro.fast.security.core.pojo.ImageCode;
|
||||
import com.micro.fast.security.core.pojo.ValidateCode;
|
||||
import com.micro.fast.security.core.util.ValidateCodeUtil;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.social.connect.web.HttpSessionSessionStrategy;
|
||||
import org.springframework.social.connect.web.SessionStrategy;
|
||||
@@ -26,14 +26,14 @@ public class ValidateCodeController {
|
||||
@Autowired
|
||||
private SecurityProperties securityProperties;
|
||||
|
||||
@Autowired
|
||||
private ValidateCodeUtil validateCodeUtil;
|
||||
|
||||
private SessionStrategy sessionStrategy = new HttpSessionSessionStrategy();
|
||||
|
||||
@GetMapping("/code/image")
|
||||
public void createCode(HttpServletResponse response, HttpServletRequest request) throws IOException {
|
||||
//创建图片验证码
|
||||
ImageCodeUtil imageCodeUtil = new ImageCodeUtil();
|
||||
imageCodeUtil.setSecurityProperties(securityProperties);
|
||||
ImageCode imageCode = imageCodeUtil.createImageCode(new ServletWebRequest(request));
|
||||
ImageCode imageCode = validateCodeUtil.createImageCode(new ServletWebRequest(request));
|
||||
ValidateCode validateCode = new ValidateCode(imageCode.getCode(),imageCode.getExpireTime());
|
||||
//将验证码对象写入session中
|
||||
sessionStrategy.setAttribute(new ServletWebRequest(request), ValidateCodeConst.SESSION_KEY_IMAGE_CODE,validateCode);
|
||||
|
||||
+54
-4
@@ -1,15 +1,18 @@
|
||||
package com.micro.fast.security.core.filter;
|
||||
|
||||
import com.micro.fast.security.core.config.param.SecurityProperties;
|
||||
import com.micro.fast.security.core.constant.ValidateCodeConst;
|
||||
import com.micro.fast.security.core.exception.ValidateCodeException;
|
||||
import com.micro.fast.security.core.pojo.ImageCode;
|
||||
import com.micro.fast.security.core.pojo.ValidateCode;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
|
||||
import org.springframework.social.connect.web.HttpSessionSessionStrategy;
|
||||
import org.springframework.social.connect.web.SessionStrategy;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.AntPathMatcher;
|
||||
import org.springframework.web.context.request.ServletWebRequest;
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
|
||||
@@ -18,11 +21,14 @@ import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 图片验证码校验过滤器
|
||||
*/
|
||||
public class ValidateCodeFilter extends OncePerRequestFilter{
|
||||
public class ValidateCodeFilter extends OncePerRequestFilter implements InitializingBean{
|
||||
|
||||
|
||||
private AuthenticationFailureHandler authenticationFailureHandler;
|
||||
@@ -31,15 +37,44 @@ public class ValidateCodeFilter extends OncePerRequestFilter{
|
||||
*/
|
||||
private SessionStrategy sessionStrategy = new HttpSessionSessionStrategy();
|
||||
|
||||
private SecurityProperties securityProperties;
|
||||
|
||||
private Set<String> filterUrl = new HashSet<String>();
|
||||
|
||||
/**
|
||||
* 初始化filter url
|
||||
* @throws ServletException
|
||||
*/
|
||||
@Override
|
||||
public void afterPropertiesSet() throws ServletException {
|
||||
super.afterPropertiesSet();
|
||||
String url = securityProperties.getCode().getImage().getUrl();
|
||||
String[] urls = url.split(",");
|
||||
for (String s : urls) {
|
||||
filterUrl.add(s);
|
||||
}
|
||||
filterUrl.add("/user/login");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(
|
||||
HttpServletRequest httpServletRequest
|
||||
, HttpServletResponse httpServletResponse
|
||||
, FilterChain filterChain)
|
||||
throws ServletException, IOException {
|
||||
|
||||
//判断是否需要验证码校验
|
||||
boolean filter = false;
|
||||
AntPathMatcher antPathMatcher = new AntPathMatcher();
|
||||
Iterator<String> iterator = filterUrl.iterator();
|
||||
while (iterator.hasNext()){
|
||||
if (antPathMatcher.match(iterator.next(),httpServletRequest.getRequestURI())){
|
||||
filter = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//在登录post请求的时候对验证码进行校验
|
||||
if (StringUtils.equals("/user/login",httpServletRequest.getRequestURI())
|
||||
&& StringUtils.endsWithIgnoreCase(httpServletRequest.getMethod(),"post")){
|
||||
if (filter && StringUtils.endsWithIgnoreCase(httpServletRequest.getMethod(),"post")){
|
||||
try{
|
||||
//校验验证码是否正确
|
||||
validate(new ServletWebRequest(httpServletRequest));
|
||||
@@ -58,7 +93,6 @@ public class ValidateCodeFilter extends OncePerRequestFilter{
|
||||
* 验证码校验
|
||||
* @param servletWebRequest
|
||||
*/
|
||||
//todo 实现验证码校验的逻辑
|
||||
private void validate(ServletWebRequest servletWebRequest) {
|
||||
ValidateCode validateCode = (ValidateCode)(sessionStrategy.getAttribute(servletWebRequest, ValidateCodeConst.SESSION_KEY_IMAGE_CODE));
|
||||
String code = servletWebRequest.getParameter("imageCode");
|
||||
@@ -84,4 +118,20 @@ public class ValidateCodeFilter extends OncePerRequestFilter{
|
||||
public void setAuthenticationFailureHandler(AuthenticationFailureHandler authenticationFailureHandler) {
|
||||
this.authenticationFailureHandler = authenticationFailureHandler;
|
||||
}
|
||||
|
||||
public Set<String> getFilterUrl() {
|
||||
return filterUrl;
|
||||
}
|
||||
|
||||
public void setFilterUrl(Set<String> filterUrl) {
|
||||
this.filterUrl = filterUrl;
|
||||
}
|
||||
|
||||
public SecurityProperties getSecurityProperties() {
|
||||
return securityProperties;
|
||||
}
|
||||
|
||||
public void setSecurityProperties(SecurityProperties securityProperties) {
|
||||
this.securityProperties = securityProperties;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-3
@@ -3,8 +3,6 @@ package com.micro.fast.security.core.util;
|
||||
import com.micro.fast.security.core.config.param.ImageCodeProperties;
|
||||
import com.micro.fast.security.core.config.param.SecurityProperties;
|
||||
import com.micro.fast.security.core.pojo.ImageCode;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.bind.ServletRequestUtils;
|
||||
import org.springframework.web.context.request.ServletWebRequest;
|
||||
|
||||
@@ -15,7 +13,7 @@ import java.util.Random;
|
||||
/**
|
||||
* 验证码工具类
|
||||
*/
|
||||
public class ImageCodeUtil {
|
||||
public class ImageCodeUtil implements ValidateCodeUtil{
|
||||
|
||||
private SecurityProperties securityProperties;
|
||||
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
package com.micro.fast.security.core.util;
|
||||
|
||||
import com.micro.fast.security.core.pojo.ImageCode;
|
||||
import org.springframework.web.context.request.ServletWebRequest;
|
||||
|
||||
/**
|
||||
* 验证码生成的接口
|
||||
*/
|
||||
public interface ValidateCodeUtil {
|
||||
ImageCode createImageCode(ServletWebRequest request);
|
||||
}
|
||||
+1
-1
@@ -19,5 +19,5 @@ ms:
|
||||
loginType: JSON
|
||||
code:
|
||||
image:
|
||||
length: 6
|
||||
length: 4
|
||||
|
||||
|
||||
Reference in New Issue
Block a user