Spring 安全性:具有多个客户端的自定义 RequestEntityConverter
Spring Security: Custom RequestEntityConverter with multiple clients
我正在努力让 Auth0 的客户端凭据流使用 Spring Security 5.4.1。我创建了一个小演示应用程序以供参考:https://github.com/mathias-ewald/spring-security-auth0-clientcredentials-demo
一切正常,但我想知道如何处理多个 OAuth2 客户端。据我了解,OAuth2ClientSecurityConfig 中的配置对流向任何提供商的所有客户端凭据均有效,对吗?
如果我有另一个提供者并且不想以相同的方式转换 RequestEntity 怎么办?
多租户通常没有完美的答案,因为很大程度上取决于您希望在请求中多早地分叉该行为。
在 Spring Security 的 OAuth 2.0 客户端支持中,ClientRegistration
是租户,租户信息在大多数客户端 API 中可用。
例如,根据请求中的 ClientRegistration
,您的 Auth0RequestEntityConverter
可能会有不同的行为:
public RequestEntity<?> convert(
OAuth2ClientCredentialsGrantRequest request) {
ClientRegistration client = request.getClientRegistration();
if (client ...) {
} else if (client ...) {
} ...
}
或者,如果您需要配置比请求实体转换器更多的东西,您可以通过为每个提供者构造一个 OAuth2AuthorizedClientManager
来更早地分叉行为:
public class ClientsOAuth2AuthorizedClientManager implements OAuth2AuthorizedClientManager {
private final Map<String, OAuth2AuthorizedClientManager> managers;
// ...
public OAuth2AuthorizedClient authorize(OAuth2AuthorizeRequest request) {
String clientRegistrationId = request.getClientRegistrationId();
return this.managers.get(clientRegistrationId).authorize(request);
}
}
我正在努力让 Auth0 的客户端凭据流使用 Spring Security 5.4.1。我创建了一个小演示应用程序以供参考:https://github.com/mathias-ewald/spring-security-auth0-clientcredentials-demo
一切正常,但我想知道如何处理多个 OAuth2 客户端。据我了解,OAuth2ClientSecurityConfig 中的配置对流向任何提供商的所有客户端凭据均有效,对吗?
如果我有另一个提供者并且不想以相同的方式转换 RequestEntity 怎么办?
多租户通常没有完美的答案,因为很大程度上取决于您希望在请求中多早地分叉该行为。
在 Spring Security 的 OAuth 2.0 客户端支持中,ClientRegistration
是租户,租户信息在大多数客户端 API 中可用。
例如,根据请求中的 ClientRegistration
,您的 Auth0RequestEntityConverter
可能会有不同的行为:
public RequestEntity<?> convert(
OAuth2ClientCredentialsGrantRequest request) {
ClientRegistration client = request.getClientRegistration();
if (client ...) {
} else if (client ...) {
} ...
}
或者,如果您需要配置比请求实体转换器更多的东西,您可以通过为每个提供者构造一个 OAuth2AuthorizedClientManager
来更早地分叉行为:
public class ClientsOAuth2AuthorizedClientManager implements OAuth2AuthorizedClientManager {
private final Map<String, OAuth2AuthorizedClientManager> managers;
// ...
public OAuth2AuthorizedClient authorize(OAuth2AuthorizeRequest request) {
String clientRegistrationId = request.getClientRegistrationId();
return this.managers.get(clientRegistrationId).authorize(request);
}
}