package com.kidgrow.oauth2.filter;
import com.kidgrow.authclient.properties.SecurityProperties;
import com.kidgrow.authclient.util.AuthUtils;
import com.kidgrow.common.constant.SecurityConstants;
import com.kidgrow.oauth2.exception.ValidateCodeException;
import com.kidgrow.oauth2.service.IValidateCodeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
*
* @Description:
* @Project:
* @CreateDate: Created in 2020/2/20 09:55
* @Author: liuke
*/
@Slf4j
@Component("validateCodeFilter")
public class ValidateCodeFilter extends OncePerRequestFilter {
@Autowired
private IValidateCodeService validateCodeService;
@Autowired
private SecurityProperties securityProperties;
/**
* 验证码校验失败处理器
*/
@Autowired
private AuthenticationFailureHandler authenticationFailureHandler;
/**
* 验证请求url与配置的url是否匹配的工具类
*/
private AntPathMatcher pathMatcher = new AntPathMatcher();
/**
* 返回true代表不执行过滤器,false代表执行
*/
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
securityProperties.getIgnore().getHttpUrls();
//登录提交的时候验证验证码
if (pathMatcher.match(SecurityConstants.PASSWORD_LOGIN_PRO_URL, request.getRequestURI())) {
//判断是否有不验证验证码的client
if (securityProperties.getCode().getIgnoreClientCode().length > 0) {
try {
final String[] clientInfos = AuthUtils.extractClient(request);
String clientId = clientInfos[0];
for (String client : securityProperties.getCode().getIgnoreClientCode()) {
if (client.equals(clientId)) {
return true;
}
}
} catch (Exception e) {
log.error("解析client信息失败", e);
}
}
return false;
}
return true;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
validateCodeService.validate(request);
} catch (ValidateCodeException e) {
authenticationFailureHandler.onAuthenticationFailure(request, response, e);
return;
}
chain.doFilter(request, response);
}
}