如何使用springsecuritycustomauthorization评估springcloudgateway中的HTTPPOST负载

qqrboqgw  于 2022-11-29  发布在  Spring
关注(0)|答案(1)|浏览(142)

我正在努力确保我的一些 Spring 云网关路线:
1.用户必须使用OAUTH2进行身份验证才能使用这些路由(如果没有-〉使用http 401响应)

  1. JWT访问令牌必须在"scp"声明中包含一个特定的值(在我的例子中是"2fa")(如果没有,则用http 403响应)
  2. 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。

s4chpxco

s4chpxco1#

在资源服务器上,您想要实现的是一项简单的任务,在我看来,资源访问控制是资源服务器的责任,而不是网关的责任,特别是如果访问决策涉及资源本身。
我只想让网关对OAuth2透明:保持请求授权报头以及响应状态代码不变。
我在that series of tutorials中有一些示例,它可以逐步构建到基于角色的高级访问控制。

  • 第一个演示使用spring-boot-starter-oauth2-resource-server的资源服务器安全配置(到目前为止,您已经在网关上实现了这些配置)
  • 2nd展示了如何用您选择的实现来替换JwtAuthenticationToken,它公开了强类型的私有声明。它还使用我围绕spring-boot one创建的一个薄 Package 器来大大减少Java conf。
  • 第三个演示安全性SpEL自定义,以编写如下内容
@GetMapping("/on-behalf-of/{username}")
@PreAuthorize("is(#username) or isNice() or onBehalfOf(#username).can('greet')")
public String getGreetingFor(@PathVariable("username") String username) {
   ... 
}

当然,在您的例子中,您会使用类似myControllerMethod(@RequestBody MyDto dto, Authentication auth)的签名和类似#dto.sub eq #auth.name的表达式,但您已经明白了。

相关问题