首页 > 解决方案 > 使用 Spring OAuth 支持多个资源 ID

问题描述

情况。我们正在使用 Spring OAuth 来验证安全令牌 (JWT)。该令牌具有aud特定资源 ID 的声明。以下代码正确验证使用包含客户端 ID 的 aud 声明签名的任何 JWT 令牌resourceId-123

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
  }
}

问题。我们如何支持同一路径的多个客户端 ID(在上面的示例中,/path)?我已经看到了如何为不同的API 路径配置具有不同客户端 ID 的多个 Bean 的示例,但我想用 2 个以上的客户端 ID 来保护这个资源。关于如何做到这一点的任何示例或文档?还是我们试图做一些根本不正确的事情?

标签: javaspringoauth-2.0jwtazure-active-directory

解决方案


我认为你的做法是错误的。

客户端 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')in.access()或 in之类的表达式@PreAuthorize


推荐阅读