spring-security - 如何创建 Spring Cloud 网关过滤器以添加客户端凭据访问令牌?
问题描述
我从 Spring Boot 1.5.20 迁移到 Spring Boot 2.1.4。我将使用 Zuul 和 Spring 安全 oauth 的应用程序重写为 Spring 云网关和 spring-security-oauth2-client。
我尝试创建 spring 云网关过滤器以添加 JWT 不记名令牌。我在编写过滤器时遇到问题。
这是工作流程
我尝试使用@RegisteredOAuth2AuthorizedClient但它不适用于 Spring 云网关过滤器。之后,我尝试了 oAuth2AuthorizedClientService 和 UAA loadAuthorizedClient,但没有访问令牌。
对于代码,这是我的github-repo!
我希望 Spring 云网关过滤器使用 JWT 令牌添加标头授权。
解决方案
您可以创建此过滤器:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.security.oauth2.client.AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.OAuth2AuthorizeRequest;
import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientService;
import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
import lombok.Getter;
import lombok.Setter;
public class Oauth2ClientGatewayFilter2 extends AbstractGatewayFilterFactory<Oauth2ClientGatewayFilter2.Config> {
@Autowired
private ReactiveClientRegistrationRepository clientRegistrations;
@Autowired
private ReactiveOAuth2AuthorizedClientService clientService;
public Oauth2ClientGatewayFilter2() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
OAuth2AuthorizeRequest oAuth2AuthorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId("myClient")
.principal("myPrincipal").build();
ReactiveOAuth2AuthorizedClientManager manager = new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(clientRegistrations,clientService);
return manager.authorize(oAuth2AuthorizeRequest)
.map(client -> client.getAccessToken().getTokenValue())
.map(bearerToken -> {
ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
builder.header(HttpHeaders.AUTHORIZATION, "Bearer " + bearerToken);
ServerHttpRequest request = builder.build();
return exchange.mutate().request(request).build();
}).defaultIfEmpty(exchange).flatMap(chain::filter);
};
}
@Getter
@Setter
public static class Config {
private String clientRegistrationId;
}
}
并在 application.yaml 中定义您的 OAuth2 配置:
spring:
security:
oauth2:
client:
registration:
myClient:
client-name: myClient
client-id: amiga-client
client-secret: ee073dec-869d-4e8d-8fa9-9f0ec9dfd8ea
authorization-grant-type: client_credentials
provider:
myClient:
token-uri: https://myserver.com/auth/oauth/v2/token
您只需向ReactiveOAuth2AuthorizedClientManager询问 OAuth2 不记名访问令牌,并在当前请求的Authorization标头中设置其值。
推荐阅读
- android - 如何使用 Google Play Services 14.x 将 firebase 添加到 android 项目
- unicode - 泰卢固语 Anu 脚本文本
- java - 比较两个数组时从第三个数组打印正确项目的问题
- spring - 如何使用@TransactionalEventListener 实现一个工作单元
- python-3.x - 如何在 pytorch 中向 Nural 网络添加图层
- sql - 在 Excel 中导入 SQL Server 数据 - SSL 错误
- python-3.x - 如何使用 pipenv 为 python 2.7 创建虚拟环境?
- php - Laravel 使用 subdomain() 扩展函数
- accessibility - 辅助功能设置 - WCAG2
- javascript - 如何用画布绘制这种飞溅效果