grails - spring security acl 不比较按位权限

标签 grails spring-security grails-plugin spring-security-acl

我们在 spring 安全性中遇到了意外缺乏按位权限检查的情况。我们想确认这是否是预期的行为,如果是,历史和/或理由是什么。

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

我们正在尝试的一个提炼场景涉及一个带有 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 有什么意义?
  • 处理按位权限的首选方法是什么,我们是否错误地配置了权限,还是应该只考虑实现按位权限检查(在这种情况下,执行此操作的首选方法是什么)。

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

    最佳答案

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

    关于grails - spring security acl 不比较按位权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25971979/

    相关文章:

    spring - 如何调试卡住的迁移

    amazon-web-services - 无法使用 Grails S3 演示应用程序上传到 S3

    java - 何时使用不同的 SecurityContextHolder 策略?

    java - 使用 Spring-Security 实现 HttpSessionLister 时出现问题

    facebook - 当涉及 spring security facebook 时,使用虚拟数据引导 grails 应用程序

    email - Grails 邮件连接被拒绝

    java - 正在缓存 weblogic 服务响应

    java - 如何在 Grails 应用程序上使用 PDF 查看器预览 PDF

    grails - doWithDynamicMethods访问服务

    web-services - 与grails签订第一份 SOAP 网络服务