1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| @Component @Slf4j public class AuthFilter implements GlobalFilter, Ordered {
@Autowired private DistributedCache distributedCache; // 排除过滤的 uri 地址,nacos自行添加 @Autowired private IgnoreWhiteProperties ignoreWhite; @Autowired private AuthProperties authProperties; /** * 连接 Token 前缀和 Token 值的字符 */ public static final String TOKEN_CONNECTOR_CHAT = " ";
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest.Builder mutate = request.mutate(); String path = exchange.getRequest().getURI().getPath(); // 跳过不需要验证的路径 if (StringUtils.matches(path, ignoreWhite.getWhites())) { return chain.filter(exchange); } String token = getToken(request); if (StrUtil.isEmpty(token)) { return unauthorizedResponse(exchange, ErrorCode.TOKEN_EMPTY_ERROR); } // 验证token是否过期 if (!distributedCache.hasKey(authProperties.getIdentifier() + ":login:token:" + token)) { return unauthorizedResponse(exchange, ErrorCode.TOKEN_EXPIRATION_ERROR); } String prefixToken =String.format("%s%s%s", authProperties.getPrefix(),TOKEN_CONNECTOR_CHAT, token) ; addHeader(mutate, authProperties.getIdentifier(), prefixToken,true); String loginUserKey = String.format("%S%S", SecurityConstants.USER_KEY, token); if (distributedCache.hasKey(loginUserKey)) { LoginUser loginUser= distributedCache.get(loginUserKey, LoginUser.class); if (loginUser != null){ addHeader(mutate, SecurityConstants.USER_ID_HEADER, loginUser.getUserId(),false); addHeader(mutate, SecurityConstants.USER_NAME_HEADER, loginUser.getUserName(),false); } } return chain.filter(exchange.mutate().request(mutate.build()).build()); }
private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value,Boolean isEncode) { if (value == null) { return; } String valueStr = value.toString(); if (isEncode){ mutate.header(name, valueStr); return; } String valueEncode = ServletUtils.urlEncode(valueStr); mutate.header(name, valueEncode); }
private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, ErrorCode errorCode) { log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath()); return ServletUtils.webFluxResponseWriter(exchange.getResponse(), errorCode.getMessage(), errorCode.getCode()); }
/** * 获取请求token */ private String getToken(ServerHttpRequest request) { String token = request.getHeaders().getFirst(SecurityConstants.AUTHORIZATION_HEADER); // 如果前端设置了令牌前缀,则裁剪掉前缀 if (StrUtil.isNotEmpty(token) && token.startsWith(authProperties.getPrefix())) { token = token.replaceFirst(authProperties.getPrefix(), ""); } return token; }
@Override public int getOrder() { return 0; } }
|