我的设置如下所示:
如您所见,网关从 Angular 获取路由
/api
的所有请求。
Angular 应用程序使用 MSAL Lib 对 Azure B2C 的用户进行身份验证,获取令牌并使用该 JWT 向相应的服务发出请求。
我添加到网关的内容(根据此)是一个“资源服务器”,其配置在网关中
application.yaml
如下:
spring:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: ${CIAM_B2C_JWK_SET_URI}
issuer-uri: ${CIAM_B2C_ISSUER_URI}
audiences: ${CIAM_B2C_AUDIENCES}
现在每个通过网关的请求都需要一个有效的 JWT。这对于“安全服务一”和“安全服务二”来说很好。
此外,所有路由也都在
application.yaml
中配置,例如:
routes:
# secure service one
- id: secure-service-one
uri: http://localhost:8080
predicates:
- Path=/api/secure-service-one/public/**
filters:
- StripPrefix=3
我的问题是,在我不想要 JWT 验证的情况下,“公共服务”也是安全的。
我知道我可能可以添加一个
SecurityConfiguration
并表示该路线不安全,但我认为应该有一种方法可以使用 filter
来做到这一点,例如:
routes:
# secure service one
- id: secure-service-one
uri: http://localhost:8080
predicates:
- Path=/api/secure-service-one/public/**
filters:
- StripPrefix=3
- AuthenticationFilter
所以我可以在一个地方设置每条路线。
感谢任何帮助或提示。
溺水者上的“服务*”实际上是为资源提供服务的。它了解该资源的内部和业务规则。访问控制(谁可以访问以及他可以用它做什么)是该业务的一部分,最好放置在资源服务器上. 如果我们以“论坛”应用程序为例,则任何具有“版主”权限的用户或与该帖子具有“作者”关系的用户都可以编辑“帖子”。网关不应该了解资源之间的关系并且这样的访问控制规则可以轻松地仅在了解帖子关系的“帖子服务”上进行单元测试,然后应该是实现此访问控制的资源服务器。
根据最新建议,我们应该只使用“机密”OAuth2 客户端。这不包括单页面(Angular、React、Vue、Flutter Web...)和移动应用程序,但使网关成为一个很好的候选者。这甚至被称为 BFF 模式,我为它编写了一个教程。
访问令牌随网关请求的唯一有效情况是“服务”通过此网关相互通信或“外部服务器”需要查询您的 API 时。但这不需要网关配置为资源服务器,也不需要实现访问控制,只要其背后的服务是具有访问控制的资源服务器即可。
简而言之,仅对网关自身的资源(例如执行器端点)进行访问控制。使用
oauth2Login
和 TokenRelay
过滤器为需要用户会话的前端(例如您的 Angular 应用程序)定义路由,以及没有会话或 TokenRelay
的其他路由用于服务间通信。