package com.vincent.rsf.openApi.security.filter;
|
|
import com.vincent.rsf.openApi.entity.constant.Constants;
|
import com.vincent.rsf.openApi.security.service.AppAuthService;
|
import com.vincent.rsf.openApi.security.utils.TokenUtils;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.core.annotation.Order;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.StringUtils;
|
import org.springframework.web.filter.OncePerRequestFilter;
|
|
import javax.annotation.Resource;
|
import javax.servlet.FilterChain;
|
import javax.servlet.ServletException;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.io.PrintWriter;
|
|
/**
|
* AppId/Token 认证过滤器
|
*/
|
@Slf4j
|
@Component
|
@Order(1)
|
public class AppIdAuthenticationFilter extends OncePerRequestFilter {
|
|
@Resource
|
private AppAuthService appAuthService;
|
|
@Override
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
throws ServletException, IOException {
|
|
String requestURI = request.getRequestURI();
|
if (isAuthRequest(requestURI)) {
|
filterChain.doFilter(request, response);
|
return;
|
}
|
|
String authHeader = request.getHeader(Constants.HEADER_AUTHORIZATION);
|
if (authHeader != null) {
|
String token = TokenUtils.extractTokenFromHeader(authHeader);
|
if (token != null && TokenUtils.validateTokenTime(token)) {
|
String tokenAppId = TokenUtils.getAppIdFromToken(token);
|
String tokenAppSecret = TokenUtils.getSecretFromToken(token);
|
if (!StringUtils.hasText(tokenAppId) || !StringUtils.hasText(tokenAppSecret)
|
|| !appAuthService.validateApp(tokenAppId, tokenAppSecret)) {
|
log.warn("Token验证失败");
|
sendErrorResponse(response, Constants.UNAUTHENTICATED_CODE, "认证失败,请提供有效的Token");
|
return;
|
}
|
request.setAttribute(Constants.REQUEST_ATTR_APP_ID, tokenAppId);
|
} else {
|
log.warn("Token验证失败或缺失");
|
sendErrorResponse(response, Constants.UNAUTHENTICATED_CODE, "认证失败,请提供有效的Token");
|
return;
|
}
|
} else {
|
log.warn("缺少Token认证信息");
|
sendErrorResponse(response, Constants.UNAUTHENTICATED_CODE, "认证失败,请提供有效的Token");
|
return;
|
}
|
|
filterChain.doFilter(request, response);
|
}
|
|
private void sendErrorResponse(HttpServletResponse response, int code, String message) throws IOException {
|
response.setStatus(code);
|
response.setContentType("application/json;charset=UTF-8");
|
PrintWriter writer = response.getWriter();
|
writer.write("{\"code\": " + code + ", \"msg\": \"" + message + "\", \"data\": null}");
|
writer.flush();
|
}
|
|
private boolean isAuthRequest(String requestURI) {
|
return requestURI != null && requestURI.contains("/getToken");
|
}
|
|
@Override
|
protected boolean shouldNotFilter(HttpServletRequest request) {
|
String requestURI = request.getRequestURI();
|
return requestURI == null
|
|| requestURI.contains("/auth/")
|
|| requestURI.contains("/public/")
|
|| requestURI.contains("/doc.html")
|
|| requestURI.contains("/swagger")
|
|| requestURI.contains("/webjars")
|
|| requestURI.contains("/v2/api-docs")
|
|| requestURI.contains("/v3/api-docs");
|
}
|
}
|