java - 使用 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 来保护这个资源。关于如何做到这一点的任何示例或文档?还是我们试图做一些根本不正确的事情?
解决方案
我认为你的做法是错误的。
客户端 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
。
推荐阅读
- python - 将预测保存到 json 或 txt 文件,并将输出视频文件保存在 yolov3 对象检测中 - Google colab
- python - 按给定列表的顺序选择重复的熊猫数据框行并保留原始索引
- python - python list.sort() 与 list.sort(key=itemgetter(0))
- spring - 有人可以提供spring security提供的过滤器链中过滤器的完整列表吗?
- arrays - 在稳定的生锈中,如何将最小值移出数组,删除其他值?
- css - 如何在保持宽度的同时将标题移动到右侧?
- c# - C# Snackbar 作为对话框
- android - 将 Mopub 与 AdMob 中介集成:未找到清单错误
- python - pytoch: RuntimeError: shape '[-1, 14]' 对于大小为 491520 的输入无效
- c++ - 使用 nlohmann/json 库序列化 cv::Mat