【问题标题】:When should I implement Spring Security ACL in my application?我应该什么时候在我的应用程序中实现 Spring Security ACL?
【发布时间】:2014-12-20 09:04:52
【问题描述】:

Spring Security ACL 看起来非常强大,并且当您可以坚持使用它们的数据库实现时,它很容易实现。但是,当您必须实现自己的 Acl 和 AclService 时,它似乎变得更加复杂(例如,参见这个(旧的)very basic tutorial,只有约 26 页)并且似乎很难找到它的参考和示例(该教程来自 2008 年)。

例如,在我们的应用程序中,用户具有角色并属于部门。大多数时候,他们被允许根据他们的角色对属于他们部门的对象执行一些操作。在所有情况下,部门 + 角色足以决定是否应授予用户对特定对象的特定操作。

用户、角色和部门由外部应用程序管理,当用户连接时我们会从该应用程序中检索它们(我们使用的是 REST 服务,但它也可以是 LDAP 服务器)。

我们希望依靠@PreAuthorize('hasPermission(…)') 来实现域对象安全。因此有两种解决方案:

  1. 实现一个自定义的PermissionEvaluator 来完成整个检查;或
  2. 使用自定义 AclService 实现 ACL,该 AclService 构建 ACL 正常工作所需的对象结构。

似乎实现整个AclService 会比实现PermissionEvaluator 更困难、更复杂,但ACL 似乎更标准。

您应该根据哪些标准实施其中一个?

【问题讨论】:

    标签: spring security spring-security spring-security-acl


    【解决方案1】:

    PermissionEvaluator 负责表达式评估以确定用户是否具有给定域对象的权限。另一方面,AclService 提供了一个用于检索Acl 实例的接口。本着Separation of concerns 的精神,每个组件都解决了一个单独的问题。

    如果任何PermissionEvaluator 实现需要基于Acl 实例执行评估,它应该委托给AclService 来检索它们。实际上AclPermissionEvaluator 正是这样做的。

    我建议你走这条路。将评估与 ACL 检索分开。如果 Spring AclService 和 Acl 的概念对于您的用例来说过于复杂或复杂,您可以引入自己的服务来检索自定义 ACL。然后实现PermissionEvaluator,它将委托给您的 ACL 服务。

    实际上,我不得不做类似的事情,因为我需要将 ACL 存储在 NoSQL 数据库中,而 Spring 提供的对我不起作用。

    我想说的是调整 Spring ACL 以满足您的要求所需的工作以及实施自定义解决方案所需的工作。如果您的要求可以通过默认的 Spring ACL 实现来满足,那就去做吧。它肯定会节省您实施自定义解决方案的时间。但是,如果无法使 Spring ACL 适应您的要求或者太难,那么实现您的自定义解决方案会更容易。

    【讨论】:

    • 感谢您的回答。实际上我的问题更有意义:什么时候有意义,什么时候值得让你的应用程序的安全实现适合 Spring Security ACL?
    猜你喜欢
    • 2011-03-11
    • 2021-02-08
    • 2017-06-28
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多