【发布时间】:2018-12-30 01:16:02
【问题描述】:
我目前正在为 Web 应用程序开发 spring-boot 2.0 REST 后端。 spring-boot 应用程序接收 OAuth2 AccessTokens 以进行身份验证,并使用应用程序特定角色进行授权。现在我想保护基于OAuth2 角色的各种REST 端点和方法。我正在寻找一种不会将我的代码直接与角色耦合的解决方案,不是,例如 @PreAuthorize("hasRole('ADMIN')")。
除了授权之外,REST 端点还应返回自定义结果(例如,如果请求包含具有角色“company_A_internal”的有效OAuth2 令牌,则响应应包含在“company_A”上过滤的结果集')。
到目前为止我已经完成的工作:
- 在
spring-security的帮助下基于OAuth2令牌的身份验证 - 将
OAuth2令牌角色映射到spring-securityGrantedAuthorities,以便SecurityContextHolder.getContext().getAuthentication().getAuthorities()返回以前的角色
我在寻找什么:
根据角色(现在存储在GrantedAuthorities 中),REST 端点应由单独的机制保护。我做了一些研究,发现了一个非常有趣的article。
我想实现与此类似的东西(例如,作为单独的 roles_config.yml):
order_manager:
'/orders':
- 'GET'
- 'POST'
- 'PUT'
- 'DELETE'
order_editor:
'/orders':
- 'GET'
- 'POST'
- 'PUT'
order_inspector:
'/orders':
- 'GET'
之后我只需要在 spring-boot 上下文中实现类似的东西:
@Secured
@RequestMapping("/orders")
public void updateOrder (Order order) {
Order updatedOrder = process(order);
return updatedOrder;
}
这将如何在spring-security 的上下文中工作?在我当前的设置之上是否有任何可能的方法来实现这一点?
感谢任何形式的建议和帮助,并很乐意回答 cmets 和其他问题。
【问题讨论】:
-
我认为这是个坏主意,而且该博客并没有真正的帮助。首先:在 yaml 文件中,很可能会出现 URL 拼写错误。第二:如果您更改代码(注释)中的 URL,您也必须始终更改 yaml 文件。顺便说一句:OAuth2 没有任何角色。
标签: java spring spring-boot spring-security authorization