使用 Spring Security 5 OAuth2.0 动态配置客户端注册范围

Tha*_*sel 6 spring spring-security oauth-2.0 spring-boot spring-webclient

我想动态更改客户端注册的范围。我知道如何以这种方式设置注册:

spring:
  security:
    oauth2:
      client:
        registration:
          custom:
            client-id: clientId
            client-secret: clientSecret
            authorization-grant-type: client_credentials
        provider:
          custom:
            token-uri: http://localhost:8081/oauth/token
Run Code Online (Sandbox Code Playgroud)

我如何以编程方式配置它?

mat*_*219 4

您需要提供自定义ClientRegistrationRepositorybean。它在docs中进行了描述。

@Configuration
public class OAuth2LoginConfig {

    @Bean
    public ClientRegistrationRepository clientRegistrationRepository() {
        return new InMemoryClientRegistrationRepository(this.googleClientRegistration());
    }

    private ClientRegistration googleClientRegistration() {
        return ClientRegistration.withRegistrationId("google")
            .clientId("google-client-id")
            .clientSecret("google-client-secret")
            .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
            .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
            .redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}")
            .scope("openid", "profile", "email", "address", "phone")
            .authorizationUri("https://accounts.google.com/o/oauth2/v2/auth")
            .tokenUri("https://www.googleapis.com/oauth2/v4/token")
            .userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo")
            .userNameAttributeName(IdTokenClaimNames.SUB)
            .jwkSetUri("https://www.googleapis.com/oauth2/v3/certs")
            .clientName("Google")
            .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来这是在启动时定义的。有没有一种简单的方法可以使这种动态化?我需要范围取决于客户的要求。 (3认同)
  • @ThatHansel 您是否找到了使 ClientRegistration 更加动态而不是在启动过程中的解决方案? (3认同)