我应该何时在我的应用程序中实现Spring Security ACL?

时间:2014-10-24 13:57:25

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

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

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

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

我们希望依靠@PreAuthorize('hasPermission(…)')来实现域对象安全性。因此可以看到2种解决方案:

  1. 实施执行整个检查的自定义PermissionEvaluator;或
  2. 使用自定义AclService实施ACL,以构建ACL正常工作所必需的对象结构。
  3. 似乎实现整个AclService比实现PermissionEvaluator更困难,更复杂,但ACL似乎更标准。

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

1 个答案:

答案 0 :(得分:19)

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

如果任何PermissionEvaluator实施需要根据Acl实例执行评估,则应委托AclService进行检索。实际上AclPermissionEvaluator正是如此。

我建议你这样走。从ACL检索中分离评估。如果Spring AclServiceAcl的概念对于您的用例来说过于复杂或复杂,您可以引入自己的服务来检索自定义ACL。然后实现将委派给您的ACL服务的PermissionEvaluator

实际上,我必须做类似的事情,因为我需要在NoSQL数据库中存储ACL,而Spring提供的功能并不适用于我。

我想说的是调整Spring ACL以满足您的要求和实现自定义解决方案所需的工作。如果使用默认的Spring ACL实现可以满足您的要求,那就去吧。它绝对可以节省您实施自定义解决方案的时间。但是,如果无法根据您的要求调整Spring ACL,或者它太困难,那么实现自定义解决方案会更容易。