spring-boot - 如何使用具有多个资源 ID 的 ResourceServer 实现来保护 api?
问题描述
我有一个要求,我需要在我的应用程序中使用由不同资源服务器获得的不同令牌来保护不同的 api 集。
/api/user/** -> API 应该使用 token(T1) 进行身份验证,从提供者 RS1 获得 /api/admin/** -> API 应该使用 token(T2) 进行身份验证,从提供者 RS2 获得
T1 应该不能访问 /api/admin/** 并且 T2 应该不能访问 /api/user/**
两者 - RS1 和 RS2 都发出 JWT。
这怎么可能,使用 Spring 的资源服务器实现?任何指针表示赞赏。
解决方案
我假设您的意思是说不同的令牌是从不同的授权服务器获得的。
在这种情况下,您可以查看多租户应用程序。
区分租户的一种方法是通过发行人索赔。为此,您可以使用 aJwtIssuerAuthenticationManagerResolver
或JwtIssuerReactiveAuthenticationManagerResolver
。
@Bean
SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
JwtIssuerReactiveAuthenticationManagerResolver authenticationManagerResolver =
new JwtIssuerReactiveAuthenticationManagerResolver(
"https://idp.example.org/issuerOne",
"https://idp.example.org/issuerTwo");
http
.authorizeExchange(exchanges -> exchanges
.anyExchange().authenticated()
)
.oauth2ResourceServer(oauth2 -> oauth2
.authenticationManagerResolver(authenticationManagerResolver)
);
return http.build();
}
以下是一些可帮助您入门的更多资源:
- Spring Security参考文档中的多租户部分
- spring-security GitHub 存储库中的示例
- SpringOne 2019的 Spring Security 5.2 多租户 OAuth演讲
推荐阅读
- python - 计算每个模型 ID 的流失率
- javascript - 如何使用 AJAX 自动检测页面上的更改并刷新内容?
- java - 如何从另一个类调用方法以在我的 ActionListener 类中使用
- sql - 是否可以在 django 模型中存储属性外键?
- html - 我应该如何更改移动设备的 React 输入按钮宽度?
- powerbi - 使用 DAX 和 3 个上下文的嵌套 If Problem
- reactjs - Material UI - 将道具应用于伪元素
- amazon-web-services - AWS Route53 子域间歇性关闭
- mongodb - 添加更多属性时未使用 Mongo 索引
- html - 材质图标对齐问题