package com.doumee.config.Jwt;
|
|
import com.doumee.biz.system.SystemDictDataBiz;
|
import com.doumee.config.annotation.ErpLoginRequired;
|
import com.doumee.config.annotation.LoginRequired;
|
import com.doumee.core.constants.ResponseStatus;
|
import com.doumee.core.exception.BusinessException;
|
import com.doumee.core.utils.Constants;
|
import com.doumee.core.utils.redis.RedisUtil;
|
import io.jsonwebtoken.JwtException;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Configuration;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.method.HandlerMethod;
|
import org.springframework.web.servlet.HandlerInterceptor;
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.lang.reflect.Method;
|
|
@Configuration
|
public class WebMvcConfig implements WebMvcConfigurer {
|
|
|
@Autowired
|
private JdbcTemplate dao;
|
|
@Autowired
|
private SystemDictDataBiz systemDictDataBiz;
|
|
@Autowired
|
private RedisTemplate<String,Object> redisTemplate;
|
|
/**
|
* 添加拦截器
|
*/
|
@Override
|
public void addInterceptors(InterceptorRegistry registry) {
|
//API接口JwtToken拦截器
|
HandlerInterceptor TokenInterceptor = new HandlerInterceptor() {
|
@Override
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
// 如果不是映射到方法直接通过
|
if (!(handler instanceof HandlerMethod)) {
|
return true;
|
}
|
HandlerMethod handlerMethod = (HandlerMethod) handler;
|
|
Class<?> beanType = handlerMethod.getBeanType();
|
|
// Method method = handlerMethod.getMethod();
|
|
// 有 @LoginRequired 注解,需要登录认证
|
if (beanType.isAnnotationPresent(LoginRequired.class) || handlerMethod.hasMethodAnnotation(LoginRequired.class)) {
|
//获取token
|
String token = request.getHeader(JwtTokenUtil.HEADER_KEY); // 从 http 请求头中取出 token
|
if (StringUtils.isNotBlank(token)) {
|
checkLogin(request,response);
|
} else {
|
throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
|
}
|
} else if(beanType.isAnnotationPresent(ErpLoginRequired.class) || handlerMethod.hasMethodAnnotation(ErpLoginRequired.class)){
|
try {
|
//ERP 业务注解
|
String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
|
String redisToken = RedisUtil.getObject(redisTemplate,Constants.RedisKeys.ERP_TOKEN,String.class);
|
if(StringUtils.isBlank(redisToken)||!token.equals(redisToken)){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未登录");
|
}
|
request.setAttribute(JwtTokenUtil.HEADER_KEY,token);
|
} catch (IllegalArgumentException | JwtException e) {
|
throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
|
}
|
// request.setAttribute("token", token);
|
}
|
return true;
|
}
|
};
|
registry.addInterceptor(TokenInterceptor).addPathPatterns("/web/**","/visitbiz/**");
|
}
|
|
|
|
public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response){
|
String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
|
try {
|
//判断Token是否超时
|
boolean expiration = JwtTokenUtil.isTokenExpired(token);
|
if (expiration) {
|
throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
|
}
|
//获取账号ID
|
String memberId = JwtTokenUtil.getJwtPayLoad(token).getMemberId();
|
Integer isDeleted = dao.queryForObject(" select COALESCE(DELETED,1) from `system_user` where id = ?", Integer.class, memberId);
|
if(isDeleted== Constants.ONE){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
|
}
|
Integer isForbidden = dao.queryForObject(" select COALESCE(STATUS,1) from `system_user` where id = ?", Integer.class, memberId);
|
if(isForbidden== Constants.ONE){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
|
}
|
Integer count = dao.queryForObject("select count(1) from `system_user` where id = ?", Integer.class, memberId);
|
if (count != null && count > 0) {
|
request.setAttribute(JwtTokenUtil.UserId_Name, memberId);
|
return true;
|
}else{
|
throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"用户信息出错");
|
}
|
} catch (IllegalArgumentException | JwtException e) {
|
throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
|
}
|
}
|
|
@Bean
|
public RestTemplate getRestTemplate(){
|
return new RestTemplate();
|
}
|
|
|
}
|