当我创建一个新实体时,我想授予这个新实体ACL权限(又称ACL条目)。到目前为止,很简单:-)
在以下情况下会出现此问题:
- 最终用户无需在网站上进行身份验证即可创建实体。
- 因此,保持此新实体的服务在没有身份验证上下文的情况下运行。
- 但是:要授予ACE,需要具有活动的身份验证上下文。
Spring的JdbcMutableAclService
使用SecurityContextHolder.getContext().getAuthentication()
来获得当前的身份验证,因此似乎没有办法绕过这个要求。
任何想法都非常感谢!
2条答案
按热度按时间svujldwt1#
自己找到了答案:
在Web应用程序中,* 总是 * 有一个验证上下文。如果用户未通过验证,则验证是
org.springframework.security.authentication.AnonymousAuthenticationToken
,它具有单个授予的权限:ROLE_ANONYMOUS
.因此,授予此用户创建ACL的权限非常简单,只需配置
PermissionGrantingStrategy
使用此角色对请求进行授权即可。blmhpbnm2#
主要的答案在当前版本的Spring(5.3.22)和Spring Security(5.7.3)中不起作用。我怀疑它甚至在2012年也起作用,当时的答案是发布的,因为它没有意义。
PermissionGrantingStrategy
是只包含bool isGranted(Acl, List<Permission>, List<Sid>, boolean)
方法的类,bool isGranted(Acl, List<Permission>, List<Sid>, boolean)
方法决定List<Sid>
中的主体是否可以使用List<Permission>
中的任何权限访问具有相应Acl的对象。这是当使用者想要存取具有特定权限的对象时所呼叫的函式。这个方法会决定是否授与或拒绝存取。
这与允许匿名用户修改现有Acl无关。实际的问题来自于在身份验证上下文为空时调用
MutableAcl aclService.createAcl(ObjectIdentity)
。这是由Spring提供的JdbcMutableAclService
实现的。问题在于MutableAcl JdbcMutableAclService.createAcl(ObjectIdentity)
有这个调用Authentication auth = SecurityContextHolder.getContext().getAuthentication();
,它强制访问授权上下文,即使Sid可以传递给createAcl方法。因此业务逻辑将能够为参数中传递的选定用户创建Acls。相反,如果我们想继续使用Spring类,我们有这个调用,它使我们不可能从未经身份验证的上下文中使用Acls。
因此,解决方案是重新实现
JdbcMutableAclService
,这样createAcl方法就不会调用身份验证上下文,而是使用额外的参数来指示我们要创建Acls的用户的Sid。如果任何人有任何关于如何做到这一点的想法,将不胜感激。
当我的Web应用程序启动时,我尝试以编程方式初始化我的Acl表,但我无法这样做,因为我的初始化代码没有任何身份验证。