春季安全性使角色和权限脱钩

时间:2018-07-22 10:53:17

标签: java spring spring-boot spring-security authorization

我目前正在为Web应用程序开发一个spring-boot 2.0 REST后端。 spring-boot应用程序接收OAuth2 AccessToken进行身份验证,并具有特定于应用程序的角色进行授权。现在,我想基于REST角色保护各种OAuth2端点和方法。我正在寻找一种解决方案,它不会将我的代码直接耦合到角色,不像@PreAuthorize("hasRole('ADMIN')")那样。

除了授权,REST端点还应该返回定制的结果(例如,如果请求包含有效的OAuth2令牌且角色为'company_A_internal',则响应应包含结果集过滤为“ company_A”)。

到目前为止我已经完成的事情:

  1. OAuth2的帮助下基于spring-security令牌的身份验证
  2. OAuth2令牌角色映射到spring-security GrantedAuthorities,以便SecurityContextHolder.getContext().getAuthentication().getAuthorities()返回以前的角色

我在寻找什么

基于角色(现在存储在GrantedAuthorities中),REST端点应通过单独的机制进行保护。我做了一些研究,发现了一个非常有趣的article

我想实现类似的功能(例如,作为单独的role_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的上下文中这将如何工作?是否可以在当前设置的基础上实现此目的?

我感谢任何形式的建议和帮助,并很乐意回答评论和其他问题。

1 个答案:

答案 0 :(得分:0)

您可以尝试https://github.com/vsfexperts/rbac。您必须配置从角色到特权的映射,并使用@Secured(“ some_privilege”)注释端点。 请记住,这是静态的,并且不允许基于内容的安全性,例如对/ orders / 5的访问将不仅限于x的用户,x是5的所有者。它仅受角色限制,该角色具有/ orders端点注释的特权(例如@Secured(“ some_privilege”))。