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