我正在努力确保我的一些 Spring 云网关路线:
1.用户必须使用OAUTH2进行身份验证才能使用这些路由(如果没有-〉使用http 401响应)
- JWT访问令牌必须在"scp"声明中包含一个特定的值(在我的例子中是"2fa")(如果没有,则用http 403响应)
- JSON有效负载包含一个属性"user",该属性的值必须与JWT访问令牌中的"sub"声明的值相同。(如果不是,则使用http 403进行响应)
阅读文档我发现了如何设置1.和2.不幸的是,关于如何实现3的信息似乎很少。
- 我在哪里可以找到工作示例?**
下面是我的spring安全设置,来自application. yaml文件:
...
spring:
profiles: production
security:
oauth2:
resourceserver:
jwt:
issuer-uri: ${AUTH_URL}/oidc
jwk-set-uri: ${AUTH_URL}/oidc/jwks.json
...
配置我的SecurityWebFilterChain:
...
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE - 3)
public SecurityWebFilterChain secondFactorScopeApiHttpSecurity(ServerHttpSecurity http) {
final ServerWebExchangeMatcher baseScopeEndpointsMatcher = new OrServerWebExchangeMatcher(
new PathPatternParserServerWebExchangeMatcher("/api/fhir"),
new PathPatternParserServerWebExchangeMatcher("/api/fhir/List**"),
new PathPatternParserServerWebExchangeMatcher("/api/fhir/Observation**")
);
http.securityMatcher(baseScopeEndpointsMatcher)
.authorizeExchange(exchanges -> exchanges.anyExchange().hasAuthority("SCOPE_2fa"))
.oauth2ResourceServer(ServerHttpSecurity.OAuth2ResourceServerSpec::jwt);
return http.build();
}
...
我希望用户在有效负载"user"属性与JWT的子声明不匹配的情况下看到HTTP 403。
1条答案
按热度按时间s4chpxco1#
在资源服务器上,您想要实现的是一项简单的任务,在我看来,资源访问控制是资源服务器的责任,而不是网关的责任,特别是如果访问决策涉及资源本身。
我只想让网关对OAuth2透明:保持请求授权报头以及响应状态代码不变。
我在that series of tutorials中有一些示例,它可以逐步构建到基于角色的高级访问控制。
spring-boot-starter-oauth2-resource-server
的资源服务器安全配置(到目前为止,您已经在网关上实现了这些配置)JwtAuthenticationToken
,它公开了强类型的私有声明。它还使用我围绕spring-boot one创建的一个薄 Package 器来大大减少Java conf。当然,在您的例子中,您会使用类似
myControllerMethod(@RequestBody MyDto dto, Authentication auth)
的签名和类似#dto.sub eq #auth.name
的表达式,但您已经明白了。