Spring Cloud Gateway OAuth2资源服务器后端安全

vshtjzan  于 2023-04-10  发布在  Spring
关注(0)|答案(1)|浏览(162)

我有一个Sping Boot 后端设计为微服务Rest后端。我的User 2 Simple Modules使用spring-data-rest发布Rest接口。这个模块可以通过spring Cloud Gateway访问(使用Eureka 服务发现)前端是React。现在我想保护后端部分。在Gateway pom中我添加了:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.6.14</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>
....

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

然后我编辑了gatewayserver.yml

security:
  oauth2:
    resourceserver:
      jwt:
        jwk-set-uri: http://127.0.0.1:8080/auth/realms/iaamrealm/protocol/openid-connect/certs

并将其添加到applikation类

@SpringBootApplication
@EnableEurekaClient
@EnableWebFluxSecurity
public class ApiGatewayserverServerApplication {

}

网关服务器使用配置文件gateway-as-resource-server启动
在那之后,我测试了失眠症,没有承载令牌,我得到一个401未经授权,与承载我得到200确定和数据。
现在我有两个问题
1.如何配置授权可以hasAuthority("SCOPE_default-user-scope")检查作用域是否存在或执行其他授权检查
1.如果一个后端服务调用另一个后端服务,我是否必须转发承载令牌手册(可能带有过滤器),或者是否有其他可能性?
我试着在Spring Cloud Docu Spring Doc和Google中找到更多信息,但没有结果。

4urapxun

4urapxun1#

您正在查找的文档是Spring Security one:从安全性的Angular 来看,配置为资源服务器的spring-cloud-gateway只是一个普通的(React式)资源服务器。

网关访问控制

在网关上编写访问控制时,不能使用方法安全性(@PreAuthorize("hasAuthority("SCOPE_default-user-scope")")等),必须在配置安全过滤器链时实现这些规则。
请注意,如果您提供了一个安全过滤器链,它将取代自动配置的安全过滤器链。因此,它必须是一个完整的资源服务器安全过滤器链(仅提供authorizeExchange语句是不够的)。
在网关上编写访问控制规则的其他限制包括

  • 你很难对这些规则进行单元测试
  • 涉及资源本身的规则(如“具有SUPERUSER角色或是被访问资源的作者”)看起来不自然,并引入与底层资源服务器的紧密耦合。

服务间调用

两种情况:

  • 请求是代表发起当前请求的“用户”发出的,在这种情况下,子请求应该使用身份验证中包含的承载令牌进行授权(其本身从安全上下文中检索)
  • 请求由微服务以其自己的名称发出(没有用户的上下文),则应使用客户端凭据来获取新的访问令牌

WebClient有一些过滤器可以从安全上下文中检索访问令牌并为您设置授权头:ServletOAuth2AuthorizedClientExchangeFilterFunctionServerOAuth2AuthorizedClientExchangeFilterFunction

意见

我个人从不将网关配置为资源服务器:

  • 我喜欢资源服务器负责它所管理的资源(包括访问控制)
  • 我喜欢方法安全性:它将访问控制规则粘贴到资源端点(我发现它更易读,更容易理解适用于特定HTTP动词的特定URI的所有规则)
  • 我喜欢对访问控制规则进行单元测试(参见我写的Baeldung article
  • 我喜欢端到端安全性:如果安全性是在网关而不是服务上实现的,那么您必须非常确保不通过该网关就不可能向微服务发送请求

相关问题