Spring Security ACL看起来非常强大,并且在您可以坚持其数据库实现时易于实现。但是,当您必须实现自己的Acl
和AclService
时(例如,参见仅约26页的此(旧)very basic tutorial),它似乎变得更加复杂,并且似乎很难找到它的参考和示例(该教程来自2008年)。
例如,在我们的应用程序中,用户具有角色并属于部门。大多数情况下,他们可以根据角色对属于其部门的对象执行某些操作。在所有情况下,department + role足以决定是否应该授予用户对特定对象的特定操作。
用户,角色和部门由外部应用程序管理,我们在用户连接时从中检索它们(我们使用的是REST服务,但它也可以是LDAP服务器)。
我们希望依靠@PreAuthorize('hasPermission(…)')
来实现域对象安全性。因此可以看到2种解决方案:
PermissionEvaluator
;或AclService
实施ACL,以构建ACL正常工作所必需的对象结构。似乎实现整个AclService
比实现PermissionEvaluator
更困难,更复杂,但ACL似乎更标准。
根据您应该实施哪一个标准?
答案 0 :(得分:19)
PermissionEvaluator
负责表达式评估,以确定用户是否具有给定域对象的权限。另一方面,AclService
提供了用于检索Acl
个实例的接口。本着Separation of concerns的精神,每个组件都解决了一个单独的问题。
如果任何PermissionEvaluator
实施需要根据Acl
实例执行评估,则应委托AclService
进行检索。实际上AclPermissionEvaluator
正是如此。
我建议你这样走。从ACL检索中分离评估。如果Spring AclService
和Acl
的概念对于您的用例来说过于复杂或复杂,您可以引入自己的服务来检索自定义ACL。然后实现将委派给您的ACL服务的PermissionEvaluator
。
实际上,我必须做类似的事情,因为我需要在NoSQL数据库中存储ACL,而Spring提供的功能并不适用于我。
我想说的是调整Spring ACL以满足您的要求和实现自定义解决方案所需的工作。如果使用默认的Spring ACL实现可以满足您的要求,那就去吧。它绝对可以节省您实施自定义解决方案的时间。但是,如果无法根据您的要求调整Spring ACL,或者它太困难,那么实现自定义解决方案会更容易。