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

Did*_*r L 15 security spring spring-security spring-security-acl

Spring Security ACL看起来非常强大,并且在您可以坚持其数据库实现时易于实现.然而,当你必须实现自己的时候看起来会变得复杂得多(例如Acl,AclService参见这个(旧的)非常基本的教程只有~26页)并且似乎很难找到它的参考和示例(该教程来自2008年) ).

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

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

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

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

似乎实现整体AclService比实现整体更困难,更复杂PermissionEvaluator,但ACL似乎更标准.

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

pgi*_*cek 21

PermissionEvaluator负责表达评估,以确定用户是否具有对于给定的域对象的权限.另一方面,AclService它提供了用于检索Acl实例的接口.本着分离关注的精神,每个组成部分都涉及一个单独的问题.

如果任何PermissionEvaluator实现需要基于Acl实例执行评估,则应委托AclService检索它们.实际上AclPermissionEvaluator正是如此.

我建议你这样走.从ACL检索中分离评估.如果春天的概念AclServiceAcl过于复杂或复杂为您的使用情况,您可以介绍自己的服务来检索自定义ACL.然后实现PermissionEvaluator将委托给您的ACL服务.

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

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

  • 感谢您的回答。实际上,我的问题更多是在某种意义上:什么时候有意义,什么时候让应用程序的安全实现适合 Spring Security ACL? (3认同)