23

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

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

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

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

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

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

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

4

1 回答 1

30

PermissionEvaluator负责表达式评估以确定用户是否具有给定域对象的权限。另一方面,AclService它提供了一个用于检索Acl实例的接口。本着关注点分离的精神,每个组件处理一个单独的关注点。

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

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

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

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

于 2014-10-25T09:41:41.120 回答