@Test public void resolverArgument() throws Exception { BindingContext context = new BindingContext(); Principal user = () -> "Joe"; ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/")) .mutate().principal(Mono.just(user)).build(); MethodParameter param = this.testMethod.arg(Principal.class); Object actual = this.resolver.resolveArgument(param, context, exchange).block(); assertSame(user, actual); param = this.testMethod.arg(Mono.class, Principal.class); actual = this.resolver.resolveArgument(param, context, exchange).block(); assertTrue(Mono.class.isAssignableFrom(actual.getClass())); assertSame(user, ((Mono<?>) actual).block()); param = this.testMethod.arg(Single.class, Principal.class); actual = this.resolver.resolveArgument(param, context, exchange).block(); assertTrue(Single.class.isAssignableFrom(actual.getClass())); assertSame(user, ((Single<?>) actual).blockingGet()); }
/** * 1.首先网关检查token是否有效,无效直接返回401,不调用签权服务 * 2.调用签权服务器看是否对该请求有权限,有权限进入下一个filter,没有权限返回401 * * @param exchange * @param chain * @return */ @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String authentication = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); String method = request.getMethodValue(); String url = request.getPath().value(); log.debug("url:{},method:{},headers:{}", url, method, request.getHeaders()); //不需要网关签权的url if (authService.ignoreAuthentication(url)) { return chain.filter(exchange); } //调用签权服务看用户是否有权限,若有权限进入下一个filter if (authService.hasPermission(authentication, url, method)) { ServerHttpRequest.Builder builder = request.mutate(); //TODO 转发的请求都加上服务间认证token builder.header(X_CLIENT_TOKEN, "TODO zhoutaoo添加服务间简单认证"); //将jwt token中的用户信息传给服务 builder.header(X_CLIENT_TOKEN_USER, authService.getJwt(authentication).getClaims()); return chain.filter(exchange.mutate().request(builder.build()).build()); } return unauthorized(exchange); }
@Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { if (shouldNotFilter(exchange.getRequest())) { return chain.filter(exchange); } if (this.removeOnly) { ServerWebExchange withoutForwardHeaders = exchange.mutate() .request(builder -> builder.headers( headers -> { for (String headerName : FORWARDED_HEADER_NAMES) { headers.remove(headerName); } })).build(); return chain.filter(withoutForwardHeaders); } else { URI uri = UriComponentsBuilder.fromHttpRequest(exchange.getRequest()).build(true).toUri(); String prefix = getForwardedPrefix(exchange.getRequest().getHeaders()); ServerWebExchange withChangedUri = exchange.mutate() .request(builder -> { builder.uri(uri); if (prefix != null) { builder.path(prefix + uri.getPath()); builder.contextPath(prefix); } }).build(); return chain.filter(withChangedUri); } }
/** * * @param forwardToPath: forward target path that begin with /. * @param exchange: the current source server exchange * @param forwardAttrs : the attributes that added to forward Exchange. * @return Mono<Void> to signal forwarding request completed. */ public static Mono<Void> forward(String forwardToPath,ServerWebExchange exchange,Map<String,Object> forwardAttrs){ WebFilterChain webFilterChain = (WebFilterChain)exchange.getAttributes().get(Constant.WEB_FILTER_ATTR_NAME); ServerHttpRequest forwardReq = exchange.getRequest().mutate().path(forwardToPath).build(); ServerWebExchange forwardExchange = exchange.mutate().request(forwardReq).build(); if(null != forwardAttrs && !forwardAttrs.isEmpty()) { forwardExchange.getAttributes().putAll(forwardAttrs); } return webFilterChain.filter(forwardExchange); } }
private ServerWebExchange mapExchange(ServerWebExchange exchange, String methodParamValue) { HttpMethod httpMethod = HttpMethod.resolve(methodParamValue.toUpperCase(Locale.ENGLISH)); Assert.notNull(httpMethod, () -> "HttpMethod '" + methodParamValue + "' not supported"); if (ALLOWED_METHODS.contains(httpMethod)) { return exchange.mutate().request(builder -> builder.method(httpMethod)).build(); } else { return exchange; } }
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest.Builder mutate = request.mutate(); ServerHttpRequest build = mutate.build(); return chain.filter(exchange.mutate().request(build).build()); } }
private ServerWebExchange mapExchange(ServerWebExchange exchange, String methodParamValue) { HttpMethod httpMethod = HttpMethod.resolve(methodParamValue.toUpperCase(Locale.ENGLISH)); Assert.notNull(httpMethod, () -> "HttpMethod '" + methodParamValue + "' not supported"); if (ALLOWED_METHODS.contains(httpMethod)) { return exchange.mutate().request(builder -> builder.method(httpMethod)).build(); } else { return exchange; } }
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { URI originalUri = exchange.getRequest().getURI(); ServerHttpRequest request = exchange.getRequest(); ServerHttpRequest.Builder mutate = request.mutate(); String forwardedUri = request.getURI().toString(); if (forwardedUri != null && forwardedUri.startsWith("https")) { try { URI mutatedUri = new URI("http", originalUri.getUserInfo(), originalUri.getHost(), originalUri.getPort(), originalUri.getPath(), originalUri.getQuery(), originalUri.getFragment()); mutate.uri(mutatedUri); } catch (Exception e) { throw new IllegalStateException(e.getMessage(), e); } } ServerHttpRequest build = mutate.build(); return chain.filter(exchange.mutate().request(build).build()); }
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { Route gatewayUrl = exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); URI uri = gatewayUrl.getUri(); ServerHttpRequest request = (ServerHttpRequest)exchange.getRequest(); HttpHeaders header = request.getHeaders(); String token = header.getFirst(JwtUtil.HEADER_AUTH); Map<String,String> userMap = JwtUtil.validateToken(token); ServerHttpRequest.Builder mutate = request.mutate(); if(userMap.get("user").equals("admin") || userMap.get("user").equals("spring") || userMap.get("user").equals("cloud")) { mutate.header("x-user-id", userMap.get("id")); mutate.header("x-user-name", userMap.get("user")); mutate.header("x-user-serviceName", uri.getHost()); }else { throw new PermissionException("user not exist, please check"); } ServerHttpRequest buildReuqest = mutate.build(); return chain.filter(exchange.mutate().request(buildReuqest).build()); } }
@Override public GatewayFilter apply(Object config) { return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); String path = request.getURI().getPath(); if (!StringUtils.endsWithIgnoreCase(path, GatewaySwaggerProvider.API_URI)) { return chain.filter(exchange); } String basePath = path.substring(0, path.lastIndexOf(GatewaySwaggerProvider.API_URI)); ServerHttpRequest newRequest = request.mutate().header(HEADER_NAME, basePath).build(); ServerWebExchange newExchange = exchange.mutate().request(newRequest).build(); return chain.filter(newExchange); }; } }
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest newRequest = exchange.getRequest().mutate().header("version", "{\"discovery-springcloud-example-a\":\"1.0\", \"discovery-springcloud-example-b\":\"1.0\", \"discovery-springcloud-example-c\":\"1.0;1.2\"}").build(); ServerWebExchange newExchange = exchange.mutate().request(newRequest).build(); return chain.filter(newExchange); }
@Override public GatewayFilter apply(NameValueConfig config) { return (exchange, chain) -> { URI uri = exchange.getRequest().getURI(); StringBuilder query = new StringBuilder(); String originalQuery = uri.getRawQuery(); if (StringUtils.hasText(originalQuery)) { query.append(originalQuery); if (originalQuery.charAt(originalQuery.length() - 1) != '&') { query.append('&'); } } //TODO urlencode? query.append(config.getName()); query.append('='); query.append(config.getValue()); try { URI newUri = UriComponentsBuilder.fromUri(uri) .replaceQuery(query.toString()) .build(true) .toUri(); ServerHttpRequest request = exchange.getRequest().mutate().uri(newUri).build(); return chain.filter(exchange.mutate().request(request).build()); } catch (RuntimeException ex) { throw new IllegalStateException("Invalid URI query: \"" + query.toString() + "\""); } }; }