Spring 使用 JwtAuthenticationToken 的基于安全表达式的访问控制

Spring Security Expression Baed Access Control with JwtAuthenticationToken

我正在开发一项 RESTful 服务,该服务使用 spring-boot-starter-oauth2-resource-server 来确保安全。它有一些复杂的端点授权要求,涉及的决策不仅基于角色,还基于 JWT 中的其他声明,如位置。所以 HttpSecurity 配置的 hasRole 是不够的。

有没有办法将来自 JwtAuthenticationToken 的值与 Sprng Security 的基于表达式的访问控制和 HttpSecurity 的访问(字符串属性)方法一起使用?或者是否有其他方法可以将不同的声明集成到端点授权中?

如有任何建议,我们将不胜感激

您可以使用 SPEL 访问身份验证对象, 所以像这样的表达式:

authentication.token.claims['preferred_username'] == ......

我在方法中使用过: 例如

PreAuthorize("#createSupportQueryRequest.username == authentication.token.claims['preferred_username']")
public void createNewQuery(@RequestBody CreateSupportQueryRequest createSupportQueryRequest) {

但它应该也适用于 .access 方法。

对于更复杂的内容,您可以在使用 @ 的表达式中引用上下文中的 bean class。 例如

.access("@isPortfolioOwnerOrAdmin.check()")

这将调用 IsPortfolioOwnerOrAdmin class 上的检查方法。

您的 bean class 可以通过 SecurityConnect 访问令牌,您可以在那里执行复杂的验证逻辑,return true 或 false。