|
|
@@ -3,33 +3,35 @@ package com.shkpr.service.mcpcenterservice.filters;
|
|
|
import com.global.base.log.LogLevelFlag;
|
|
|
import com.global.base.log.LogPrintMgr;
|
|
|
import com.global.base.tools.FastJsonUtil;
|
|
|
-import com.shkpr.service.mcpcenterservice.commtools.JwtTokenUtil;
|
|
|
+import com.shkpr.service.mcpcenterservice.commtools.HttpUtils;
|
|
|
+import com.shkpr.service.mcpcenterservice.commtools.JwtTokenUtils;
|
|
|
import com.shkpr.service.mcpcenterservice.constants.ApiURI;
|
|
|
import com.shkpr.service.mcpcenterservice.dto.LogFlagBizType;
|
|
|
import com.shkpr.service.mcpcenterservice.dto.McpAuthUser;
|
|
|
import com.shkpr.service.mcpcenterservice.dto.ResponseCode;
|
|
|
import com.shkpr.service.mcpcenterservice.dto.ResponseRes;
|
|
|
-import com.shkpr.service.mcpcenterservice.globalmgr.McpAuthContextMgr;
|
|
|
-import jakarta.servlet.FilterChain;
|
|
|
-import jakarta.servlet.ServletException;
|
|
|
-import jakarta.servlet.http.HttpServletRequest;
|
|
|
-import jakarta.servlet.http.HttpServletResponse;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.core.io.buffer.DataBuffer;
|
|
|
import org.springframework.http.HttpStatus;
|
|
|
import org.springframework.http.MediaType;
|
|
|
+import org.springframework.http.server.reactive.ServerHttpRequest;
|
|
|
+import org.springframework.http.server.reactive.ServerHttpResponse;
|
|
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
|
|
-import org.springframework.security.core.context.SecurityContextHolder;
|
|
|
-import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
|
|
|
-import org.springframework.web.filter.OncePerRequestFilter;
|
|
|
+import org.springframework.security.core.context.ReactiveSecurityContextHolder;
|
|
|
+import org.springframework.web.server.ServerWebExchange;
|
|
|
+import org.springframework.web.server.WebFilter;
|
|
|
+import org.springframework.web.server.WebFilterChain;
|
|
|
+import reactor.core.publisher.Mono;
|
|
|
|
|
|
-import java.io.IOException;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
import java.util.List;
|
|
|
|
|
|
-public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
|
|
- private String mStrClassName = "";
|
|
|
- private String mBusinessType = "";
|
|
|
- private String logTag = "";
|
|
|
+public class JwtAuthenticationFilter implements WebFilter {
|
|
|
+ private final String mStrClassName;
|
|
|
+ private final String mBusinessType;
|
|
|
+ private final String logTag;
|
|
|
+
|
|
|
public JwtAuthenticationFilter() {
|
|
|
mStrClassName = this.getClass().getSimpleName();
|
|
|
mBusinessType = LogFlagBizType.BIZ_AUTH.toStrValue();
|
|
|
@@ -37,99 +39,75 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
|
|
+ public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
|
|
|
+ ServerHttpRequest request = exchange.getRequest();
|
|
|
+ ServerHttpResponse response = exchange.getResponse();
|
|
|
String token = extractToken(request);
|
|
|
+
|
|
|
if (StringUtils.isEmpty(token)) {
|
|
|
- writeAuthError(response, ResponseCode.STATUS_EMPTY_TOKEN);
|
|
|
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, mBusinessType, mStrClassName
|
|
|
- , String.format("Empty Token, Uri{%s} Remote{%s:%d}"
|
|
|
- ,request.getRequestURI()
|
|
|
- ,request.getRemoteAddr()
|
|
|
- ,request.getRemotePort()));
|
|
|
- return;
|
|
|
+ logWarn(request, "Empty Token");
|
|
|
+ return writeAuthError(response, ResponseCode.STATUS_EMPTY_TOKEN);
|
|
|
}
|
|
|
|
|
|
- McpAuthUser user = null;
|
|
|
+ McpAuthUser user;
|
|
|
try {
|
|
|
- user = JwtTokenUtil.toAuthUser(token);
|
|
|
- List<SimpleGrantedAuthority> authorities = StringUtils.isEmpty(user.getRoleId())
|
|
|
- ? List.of() : List.of(new SimpleGrantedAuthority(ApiURI.ROLE_AUTHORITY_PREFIX + user.getRoleId()));
|
|
|
-
|
|
|
- UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(user, null, authorities);
|
|
|
- authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
|
|
|
- SecurityContextHolder.getContext().setAuthentication(authentication);
|
|
|
- McpAuthContextMgr.set(token, user);
|
|
|
+ user = JwtTokenUtils.toAuthUser(token);
|
|
|
} catch (Exception ex) {
|
|
|
- SecurityContextHolder.clearContext();
|
|
|
- McpAuthContextMgr.clear();
|
|
|
- writeAuthError(response, ResponseCode.STATUS_INVALID_TOKEN);
|
|
|
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, mBusinessType, mStrClassName
|
|
|
- , String.format("Token Parse Failed, Uri{%s} Remote{%s:%d}"
|
|
|
- ,request.getRequestURI()
|
|
|
- ,request.getRemoteAddr()
|
|
|
- ,request.getRemotePort()));
|
|
|
- return;
|
|
|
+ logWarn(request, "Token Parse Failed");
|
|
|
+ return writeAuthError(response, ResponseCode.STATUS_INVALID_TOKEN);
|
|
|
}
|
|
|
|
|
|
- if (user == null){
|
|
|
- SecurityContextHolder.clearContext();
|
|
|
- McpAuthContextMgr.clear();
|
|
|
- writeAuthError(response, ResponseCode.STATUS_INVALID_TOKEN);
|
|
|
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, mBusinessType, mStrClassName
|
|
|
- , String.format("Invalid Token, Uri{%s} Remote{%s:%d}"
|
|
|
- ,request.getRequestURI()
|
|
|
- ,request.getRemoteAddr()
|
|
|
- ,request.getRemotePort()));
|
|
|
- return;
|
|
|
- }else {
|
|
|
- if (user.getExpiredTm() < System.currentTimeMillis()){
|
|
|
- SecurityContextHolder.clearContext();
|
|
|
- McpAuthContextMgr.clear();
|
|
|
- writeAuthError(response, ResponseCode.STATUS_EXPIRED_TOKEN);
|
|
|
- LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, mBusinessType, mStrClassName
|
|
|
- , String.format("Token Expired, Uri{%s} Remote{%s:%d}"
|
|
|
- ,request.getRequestURI()
|
|
|
- ,request.getRemoteAddr()
|
|
|
- ,request.getRemotePort()));
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (user == null) {
|
|
|
+ logWarn(request, "Invalid Token");
|
|
|
+ return writeAuthError(response, ResponseCode.STATUS_INVALID_TOKEN);
|
|
|
}
|
|
|
|
|
|
- try {
|
|
|
- filterChain.doFilter(request, response);
|
|
|
- } finally {
|
|
|
- McpAuthContextMgr.clear();
|
|
|
- SecurityContextHolder.clearContext();
|
|
|
+ if (user.getExpiredTm() < System.currentTimeMillis()) {
|
|
|
+ logWarn(request, "Token Expired");
|
|
|
+ return writeAuthError(response, ResponseCode.STATUS_EXPIRED_TOKEN);
|
|
|
}
|
|
|
+
|
|
|
+ List<SimpleGrantedAuthority> authorities = StringUtils.isEmpty(user.getRoleId())
|
|
|
+ ? List.of()
|
|
|
+ : List.of(new SimpleGrantedAuthority(ApiURI.ROLE_AUTHORITY_PREFIX + user.getRoleId()));
|
|
|
+
|
|
|
+ UsernamePasswordAuthenticationToken authentication =
|
|
|
+ new UsernamePasswordAuthenticationToken(user, token, authorities);
|
|
|
+
|
|
|
+ return chain.filter(exchange).contextWrite(ReactiveSecurityContextHolder.withAuthentication(authentication));
|
|
|
}
|
|
|
|
|
|
- private String extractToken(HttpServletRequest request) {
|
|
|
- String header = request.getHeader(ApiURI.HEADER_AUTHORIZATION);
|
|
|
+ private String extractToken(ServerHttpRequest request) {
|
|
|
+ String header = request.getHeaders().getFirst(ApiURI.HEADER_AUTHORIZATION);
|
|
|
if (!StringUtils.isEmpty(header))
|
|
|
return header.trim();
|
|
|
|
|
|
- String queryToken = request.getParameter(ApiURI.QUERY_TOKEN_PARAM);
|
|
|
+ String queryToken = request.getQueryParams().getFirst(ApiURI.QUERY_TOKEN_PARAM);
|
|
|
if (!StringUtils.isEmpty(queryToken))
|
|
|
return queryToken.trim();
|
|
|
return "";
|
|
|
}
|
|
|
|
|
|
- private void writeAuthError(HttpServletResponse response, ResponseCode code) throws IOException {
|
|
|
- response.setHeader("Access-Control-Allow-Origin", "*");
|
|
|
- response.setHeader("Access-Control-Allow-Methods", "*");
|
|
|
- response.setHeader("Access-Control-Allow-Headers", ApiURI.ALLOW_HEADERS);
|
|
|
- response.setStatus(HttpStatus.UNAUTHORIZED.value());
|
|
|
- response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
|
|
|
+ private Mono<Void> writeAuthError(ServerHttpResponse response, ResponseCode code) {
|
|
|
+ response.getHeaders().set("Access-Control-Allow-Origin", "*");
|
|
|
+ response.getHeaders().set("Access-Control-Allow-Methods", "*");
|
|
|
+ response.getHeaders().set("Access-Control-Allow-Headers", ApiURI.ALLOW_HEADERS);
|
|
|
+ response.setStatusCode(HttpStatus.UNAUTHORIZED);
|
|
|
+ response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
|
|
|
|
|
|
- ResponseRes<String> resResult = new ResponseRes<String>();
|
|
|
+ ResponseRes<String> resResult = new ResponseRes<>();
|
|
|
resResult.setRescode(code.toStrCode());
|
|
|
resResult.setResmsg(code.toStrMsg());
|
|
|
resResult.setResdata(code.toString());
|
|
|
resResult.setTimestamp(System.currentTimeMillis());
|
|
|
- try {
|
|
|
- response.getWriter().write(FastJsonUtil.toJSON(resResult));
|
|
|
- response.getWriter().flush();
|
|
|
- }catch (Exception e){
|
|
|
- }
|
|
|
+
|
|
|
+ byte[] bytes = FastJsonUtil.toJSON(resResult).getBytes(StandardCharsets.UTF_8);
|
|
|
+ DataBuffer buffer = response.bufferFactory().wrap(bytes);
|
|
|
+ return response.writeWith(Mono.just(buffer));
|
|
|
+ }
|
|
|
+
|
|
|
+ private void logWarn(ServerHttpRequest request, String msg) {
|
|
|
+ LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_WARN, mBusinessType, mStrClassName,
|
|
|
+ String.format("%s, Uri{%s} Remote{%s}", msg, request.getURI().getPath(), HttpUtils.getIpAddress(request)));
|
|
|
}
|
|
|
}
|