spring security acl 不比较按位权限

Posted

技术标签:

【中文标题】spring security acl 不比较按位权限【英文标题】:spring security acl doesn't compare bitwise permissions 【发布时间】:2014-11-16 07:05:01 【问题描述】:

我们在 Spring Security 中意外缺少按位权限检查。我们想确认这是否是预期的行为,如果是,历史是什么和/或这样做的理由。

我们正在使用 grails 插件 spring-security-acl-1.1.1,它使用 spring-security-acl 3.0.7.RELEASE。

我们正在尝试的一个提炼场景涉及一个具有 ACL 的对象,这样 aclUtilService.readAcl(obj) 返回授予角色:

PrincipalSid[sampleuser]; permission: BasePermission[...........................A....=16]
GrantedAuthoritySid[ROLE_RWD]; permission: CumulativePermission[............................D.WR=11]
GrantedAuthoritySid[ROLE_RW]; permission: CumulativePermission[..............................WR=3]
GrantedAuthoritySid[ROLE_R]; permission: BasePermission[...............................R=1]

随后,我们希望检查单个权限,如 WRITE 并让它返回 true。但是,这似乎不受支持。例如,对于具有上述对象上定义的所有角色的用户,执行:

READ?: $aclUtilService.hasPermission(springSecurityService.authentication, obj, BasePermission.READ)
WRITE?: $aclUtilService.hasPermission(springSecurityService.authentication, obj, BasePermission.WRITE)
DELETE?: $aclUtilService.hasPermission(springSecurityService.authentication, obj, BasePermission.DELETE)
READ-WRITE?: $aclUtilService.hasPermission(springSecurityService.authentication, obj, new BasePermission(BasePermission.READ.getMask() | BasePermission.WRITE.getMask()))

返回输出:

READ?: true
WRITE?: false
DELETE?: false
READ-WRITE?: true

而我们希望所有这些都返回 true。 查看源代码后,我们可以看到最终在 AclImpl 中检查了权限,其中包含以下行

if ((ace.getPermission().getMask() == p.getMask()) && ace.getSid().equals(sid)) 

这解释了为什么只有确切的掩码匹配。

仅更改这一行有点涉及,我们发现在 spring-security-acl 3.1 中,此代码被重构以允许定义权限授予策略-https://jira.spring.io/browse/SEC-1166

但是,默认的授予策略仍然只检查确切的掩码。所以:

为什么默认授予策略不检查位掩码?如果不应该检查 CumulativePermission 有什么意义? 处理按位权限的首选方法是什么?我们是否错误地配置了权限,或者我们是否应该只寻求实现按位权限检查(在这种情况下,首选方法是什么)。

感谢您的任何解释或指导。

【问题讨论】:

我在jira.spring.io/browse/SEC-1166 中添加了一条评论,假设 Spring Security 将采用 olifernas 解决方案。 可能重复这个:***.com/q/9018264/5134722 【参考方案1】:

当我创建插件时,这让我很惊讶。假装使用位掩码似乎很奇怪,最终将自己限制为只有 32 个权限(尽管对于大多数应用程序来说这应该足够了)。请参阅此 JIRA 以获得 Ben Alex 的解释:https://jira.spring.io/browse/SEC-1140

【讨论】:

感谢 Burt,SEC-1140 完全解释了其背后的情况和基本原理。似乎常见的混淆来自于支持屏蔽的设计,但默认行为并没有利用这一点。对于将来阅读本文的任何人,这种情况下的选项似乎是: * 使用许多单独的 BasePermission 条目而不是 CumulativePermission。 * 至少使用 spring-security-acl 3.1 并提供自定义比较策略。 对 Spring 的 DefaultPermissionGrantingStrategy 进行小修改,执行位掩码比较。 gist.github.com/oliverfernandez/36846fcdc03696a7b829你怎么看?

以上是关于spring security acl 不比较按位权限的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security Acl 对象

Spring Security 的 ACL 配置问题

Spring Security - ACL readAclsById 不按 SID 过滤

Spring Security ACL 层次结构

使用 Spring Security ACL

Spring Security(19)——对Acl的支持