情况。我们正在使用Spring OAuth来验证安全令牌(JWT)。令牌具有对特定资源ID的resourceId-123
声明。下面的代码正确地验证任何用包含客户ID class ResourceServerConfig {
@Bean
protected ResourceServerConfiguration adminResources2() {
ResourceServerConfiguration resource = new ResourceServerConfiguration() {
void setConfigurers(List<ResourceServerConfigurer> configurers) {
super.setConfigurers(configurers)
}
}
resource.setConfigurers(Collections.<ResourceServerConfigurer>singletonList(new ResourceServerConfigurerAdapter() {
@Override
void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("resourceId-123")
}
@Override
void configure(HttpSecurity http) throws Exception {
http.antMatcher("/path")
.authorizeRequests()
.anyRequest().authenticated()
}
}))
resource.setOrder(3)
return resource
}
}
的aud声明签名的JWT令牌:
/path
问题。我们如何为同一路径(在上面的示例中,string = "field1|data1||field2|data2||field3|data3"
)支持多个客户端ID?我已经看到了如何为不同 API路径配置具有不同客户端ID的多个Bean的示例,但是我想使用2个以上的客户端ID保护该资源。有什么例子或文档可以做到这一点?还是我们试图做一些根本不正确的事情?
答案 0 :(得分:1)
我认为您正在以错误的方式进行操作。
客户端ID与Spring Security中的访问者不同,而是允许客户端使用一个或多个资源ID,并且JWT可能包含多个访问者。
因此,我认为您应该遵循以下示例,在该示例中,您具有用于不同路径的不同资源ID,为共享路径创建新的资源ID,然后将其添加到所有允许访问它的客户端中。
示例:
路径:
|----------------+-------------|
| Path | Resource ID |
|----------------+-------------|
| /client1/info | client1 |
| /client2/info | client2 |
| /shared/status | all-clients |
|----------------+-------------|
客户:
|---------+----------------------|
| Client | Resource IDs |
|---------+----------------------|
| client1 | client1, all-clients |
| client2 | client2, all-clients |
|---------+----------------------|
如果您可以提供一个我可以修改的可运行示例,则显示一些内容会更容易,但是由于您发布的代码数量有限,这是我所能做的最好的事情。
另一种解决方法是使用不同的范围而不是不同的受众。这样一来,就无需配置多个资源服务器,而可以在#oauth2.hasScope('admin')
或.access()
中使用类似@PreAuthorize
的表达式。