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种解决方案:
PermissionEvaluator
整个检查的自定义; 要么AclService
构建ACL正常工作所必需的对象结构.似乎实现整体AclService
比实现整体更困难,更复杂PermissionEvaluator
,但ACL似乎更标准.
根据您应该实施哪一个标准?
pgi*_*cek 21
的PermissionEvaluator
负责表达评估,以确定用户是否具有对于给定的域对象的权限.另一方面,AclService
它提供了用于检索Acl
实例的接口.本着分离关注的精神,每个组成部分都涉及一个单独的问题.
如果任何PermissionEvaluator
实现需要基于Acl
实例执行评估,则应委托AclService
检索它们.实际上AclPermissionEvaluator
正是如此.
我建议你这样走.从ACL检索中分离评估.如果春天的概念AclService
和Acl
过于复杂或复杂为您的使用情况,您可以介绍自己的服务来检索自定义ACL.然后实现PermissionEvaluator
将委托给您的ACL服务.
实际上,我必须做类似的事情,因为我需要在NoSQL数据库中存储ACL,而Spring提供的功能并不适用于我.
我想说的是调整Spring ACL以满足您的需求和实现自定义解决方案所需的努力.如果使用默认的Spring ACL实现可以满足您的要求,那就去吧.它绝对可以节省您实施自定义解决方案的时间.但是,如果无法根据您的要求调整Spring ACL,或者它太困难,那么实现自定义解决方案会更容易.