【发布时间】:2013-08-24 08:34:58
【问题描述】:
这里的建议将不胜感激。
我们使用 Spring Security 域对象安全性来锁定对 Grails 应用程序中特定对象的访问。我们也有扩展权限。我们使用普通的@PreAuthorize 注解来控制对域对象的访问,具体取决于分配给特定用户的权限。
在此架构中,我希望一位用户能够邀请另一位用户加入群组。为此,第二个用户会收到来自第一个用户的邀请以加入具有特定权限的组。第二个用户可以选择接受或拒绝邀请。
鉴于域对象属于第一个用户,而不是第二个用户,我如何授予第二个用户对具有所提供权限的域对象的访问权限?
我尝试在服务方法上使用 @PreAuthorize("permitAll") 破解解决方案,以查看是否可行。虽然不要求安全作为授予对象设置域对象特权的特权,但它至少会让我继续前进。但不高兴,我继续收到“accessDenied for class”错误,大概是因为当前用户是第二个用户,而不是域对象所有者。
我是否需要完成 SpEL 建议 here?不幸的是,我几乎不明白 bean 解析器是如何工作的。
编辑:即使我在调用时验证邀请有效,当尝试插入新用户的第一个 ACE 时,Spring ACL 也会抛出异常。异常发生在insertAce调用的void setPermissions(ObjectIdentity oid, recipient, Collection permissions)中:
void setPermissions(ObjectIdentity oid,收件人,集合权限){ Sid sid = createSid(recipient)
MutableAcl acl
try {
acl = aclService.readAclById(oid)
}
catch (NotFoundException e) {
acl = aclService.createAcl(oid)
}
int deleted = 0
acl.entries.eachWithIndex { AccessControlEntry ace, int i ->
if (ace.sid == sid) {
acl.deleteAce(i-deleted)
deleted++
}
}
permissions.each {
acl.insertAce(acl.entries.size(), it, sid, true)
}
aclService.updateAcl acl
}
我假设访问被拒绝是因为当前用户(发出邀请时不存在)无权设置其他用户拥有的对象的权限。
【问题讨论】:
-
所以@PreAuthorize 并没有真正授权到ACL。要访问受 ACL 保护的域对象,需要当前用户具有访问权限。所以要么我完全破解 ACE 插入,要么我想办法在这种特殊情况下授予权限。
-
那么我可以使用 RunAs 身份验证替换吗?看起来它会完成这项工作。 static.springsource.org/spring-security/site/docs/3.0.x/…
-
嗯,它应该工作,但它没有。我在数据库中创建了一个新角色 RUN_AS_INVITED_USER,使用 grails.plugins.springsecurity.useRunAs = true 启用了 RUNAss,设置 grails.plugins.springsecurity.acl.authority.changeAclDetails = 'ROLE_RUN_AS_INVITED_USER' 然后用 @Secured(['ROLE_USER ', 'RUN_AS_INVITED_USER']) 但仍然没有喜悦。更糟糕的是,当我使用 springSecurityService.getPrincipal().getAuthorities() 查询方法中的当前角色时,我看不到我的新角色集。