Spring Security Spring授权服务器-将客户端限制到特定的资源服务器

flseospp  于 2022-11-24  发布在  Spring
关注(0)|答案(1)|浏览(133)

我有两个RegisteredClient(和两个资源服务器):

@Bean
public RegisteredClientRepository registeredClientRepository() {
    RegisteredClient spa1 = RegisteredClient.withId(UUID.randomUUID().toString())
        .clientId("client1")
        ...
        .redirectUri("http://127.0.0.1:3000/authorized")
        ...
        .build();
    
    RegisteredClient spa2 = RegisteredClient.withId(UUID.randomUUID().toString())
        .clientId("client2")
        ...
        .redirectUri("http://127.0.0.1:3001/authorized")
        ...
        .build();

    return new InMemoryRegisteredClientRepository(spa1, spa2);
}

当我以client1的身份获得 access_token 时,我可以访问两个资源服务器中的端点。我需要client1才能仅访问resourceServer1,需要client2才能访问resourceServer2
我看过了文档和源代码,但是我找不到一种方法来配置客户端,使其只能访问特定的资源。我认为这在Spring Security中是可能的,方法是:

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    ClientDetailsServiceBuilder.ClientBuilder clientBuilder = clients
        .inMemory()
        .withClient("client1")
        .resourceIds("resourceServer1")
        ...

这可行吗?

icomxhvb

icomxhvb1#

这通常通过访问令牌中的aud声明来完成。
当客户端请求访问令牌时,它会将目标受众发送到授权服务器,并且每个资源服务器都必须确保验证访问令牌中的aud声明是否包含资源服务器的ID。
如果您使用Sping Boot 的资源服务器启动器,我认为您可以使用spring.security.oauth2.resourceserver.jwt.audiences属性配置受众ID(在此处阅读更多信息)。
否则,您将不得不考虑使用自己的JwtValidator配置自己的JwtDecoder(这是验证JWT声明的方法)。

相关问题