|
|
@@ -0,0 +1,80 @@
|
|
|
+package com.lc.ibps.business.intercept;
|
|
|
+
|
|
|
+import com.lc.ibps.base.core.constants.StringPool;
|
|
|
+import com.lc.ibps.base.core.util.BeanUtils;
|
|
|
+import com.lc.ibps.cloud.oauth.client.filter.AbstractFilter;
|
|
|
+import com.lc.ibps.cloud.redis.utils.RedisUtil;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import javax.servlet.FilterChain;
|
|
|
+import javax.servlet.ServletException;
|
|
|
+import javax.servlet.ServletRequest;
|
|
|
+import javax.servlet.ServletResponse;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class TokenAuthInterceptor extends AbstractFilter {
|
|
|
+
|
|
|
+ private static final Set<String> NAMES = new HashSet<>(
|
|
|
+ Arrays.asList(
|
|
|
+ "/employee/signInformation/query",
|
|
|
+ "/employee/signInformation/save",
|
|
|
+ "/employee/qRcode/query",
|
|
|
+ "/employee/registrationOutsiders/query",
|
|
|
+ "/employee/registrationOutsiders/save",
|
|
|
+ "/employee/satisfaction/save",
|
|
|
+ "/employee/satisfaction/getQuestionnaireByQrCodeId"
|
|
|
+ )
|
|
|
+ );
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
|
|
+ HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
|
|
|
+ HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
|
|
|
+
|
|
|
+ httpRequest.setCharacterEncoding(StringPool.UTF_8);
|
|
|
+ httpResponse.setCharacterEncoding(StringPool.UTF_8);
|
|
|
+ String uri = httpRequest.getRequestURI();
|
|
|
+ if (NAMES.contains(uri)){
|
|
|
+ // 1. 获取令牌(支持Header/参数)
|
|
|
+ //String token = httpRequest.getParameter("token");
|
|
|
+ String token = httpRequest.getHeader("x-authorization-access_token");
|
|
|
+ // 2. 令牌不存在
|
|
|
+ if (BeanUtils.isEmpty(token)) {
|
|
|
+ sendError(httpResponse, "访问令牌缺失");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 3. 验证Redis中的令牌
|
|
|
+ String key = "white_list_access_token:" + token;
|
|
|
+ Boolean exists = RedisUtil.redisTemplateString.hasKey(key);
|
|
|
+ if (exists == null || !exists) {
|
|
|
+ sendError(httpResponse, "令牌无效或已过期");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 4. 删除令牌(一次性使用)
|
|
|
+ Boolean del = RedisUtil.redisTemplateString.delete(key);
|
|
|
+ if(del != null && del){
|
|
|
+ filterChain.doFilter(servletRequest, servletResponse);
|
|
|
+ }else {
|
|
|
+ sendError(httpResponse, "令牌不存在");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ filterChain.doFilter(servletRequest, servletResponse);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 统一错误响应
|
|
|
+ private void sendError(HttpServletResponse response, String msg) throws IOException {
|
|
|
+ response.setStatus(401);
|
|
|
+ response.setContentType("application/json");
|
|
|
+ response.setCharacterEncoding("UTF-8");
|
|
|
+ response.getWriter().write(
|
|
|
+ String.format("{\"code\":%d,\"message\":\"%s\"}", 401, msg)
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|