spring-security 如何在没有显式身份验证的情况下在Spring Security中授予ACL?

vx6bjr1n  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(151)

当我创建一个新实体时,我想授予这个新实体ACL权限(又称ACL条目)。到目前为止,很简单:-)
在以下情况下会出现此问题:

  • 最终用户无需在网站上进行身份验证即可创建实体。
  • 因此,保持此新实体的服务在没有身份验证上下文的情况下运行。
  • 但是:要授予ACE,需要具有活动的身份验证上下文。

Spring的JdbcMutableAclService使用SecurityContextHolder.getContext().getAuthentication()来获得当前的身份验证,因此似乎没有办法绕过这个要求。
任何想法都非常感谢!

svujldwt

svujldwt1#

自己找到了答案:
在Web应用程序中,* 总是 * 有一个验证上下文。如果用户未通过验证,则验证是org.springframework.security.authentication.AnonymousAuthenticationToken,它具有单个授予的权限:ROLE_ANONYMOUS .
因此,授予此用户创建ACL的权限非常简单,只需配置PermissionGrantingStrategy使用此角色对请求进行授权即可。

blmhpbnm

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表,但我无法这样做,因为我的初始化代码没有任何身份验证。

相关问题