通过Spring OAuth支持多个资源ID

时间:2019-07-18 20:49:41

标签: java spring oauth-2.0 jwt azure-active-directory

情况。我们正在使用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保护该资源。有什么例子或文档可以做到这一点?还是我们试图做一些根本不正确的事情?

1 个答案:

答案 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的表达式。