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

Spring Security ACL 看起来非常强大,并且当您可以坚持使用它们的数据库实现时,它很容易实现。但是,当您必须实现自己的 AclAclService 时,它似乎变得更加复杂(例如,参见这个(旧的)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 AclServiceAcl 的概念对于您的用例来说过于复杂或复杂,您可以引入自己的服务来检索自定义 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
    相关资源
    最近更新 更多