【问题标题】:Spring Security Expression Baed Access Control with JwtAuthenticationToken使用 JwtAuthenticationToken 的基于 Spring 安全表达式的访问控制
【发布时间】:2020-11-03 12:26:11
【问题描述】:
我正在开发一个使用 spring-boot-starter-oauth2-resource-server 来确保安全的 RESTful 服务。它有一些复杂的端点授权要求,涉及的决策不仅基于角色,还基于 JWT 中的其他声明,如位置。所以 HttpSecurity 配置的 hasRole 是不够的。
有没有办法将 JwtAuthenticationToken 中的值与 Sprng Security 的基于表达式的访问控制和 HttpSecurity 的 access(String attribute) 方法一起使用?还是有其他方法可以将不同的声明集成到端点授权中?
任何建议都将不胜感激
【问题讨论】:
标签:
spring-security
jwt
spring-security-oauth2
【解决方案1】:
您可以使用 SPEL 访问 Authentication 对象,
所以像这样的表达:
authentication.token.claims['preferred_username'] == ......
我在方法中使用过它:
例如
PreAuthorize("#createSupportQueryRequest.username == authentication.token.claims['preferred_username']")
public void createNewQuery(@RequestBody CreateSupportQueryRequest createSupportQueryRequest) {
但它也应该在 .access 方法中工作。
对于更复杂的内容,您可以使用 @ 在表达式中引用上下文中的 bean 类。
例如
.access("@isPortfolioOwnerOrAdmin.check()")
这将调用 IsPortfolioOwnerOrAdmin 类的检查方法。
您的 bean 类可以通过 SecurityConect 访问令牌,您可以在那里执行复杂的验证逻辑并返回 true 或 false。