【问题标题】:spring-security decouple roles and permissionsspring-security 解耦角色和权限
【发布时间】: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”上过滤的结果集')。

到目前为止我已经完成的工作:

  1. spring-security 的帮助下基于OAuth2 令牌的身份验证
  2. OAuth2 令牌角色映射到spring-security GrantedAuthorities,以便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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 2011-12-24
    • 2022-08-09
    • 1970-01-01
    • 2012-10-24
    • 2016-02-27
    • 2012-01-09
    • 2013-08-26
    • 2015-10-28
    相关资源
    最近更新 更多