这里的建议将不胜感激。
我们使用 Spring Security 域对象安全性来锁定对 Grails 应用程序中特定对象的访问。我们也有扩展权限。我们使用普通的@PreAuthorize 注释来控制对域对象的访问,具体取决于分配给特定用户的权限。
在这个架构中,我希望一个用户能够邀请第二个用户加入一个组。为此,第二个用户会收到来自第一个用户的邀请以加入具有特定权限的组。第二个用户可以选择接受或拒绝邀请。
鉴于域对象属于第一个用户,而不是第二个用户,我如何授予第二个用户对具有所提供特权的域对象的访问权限?
我试图破解在服务方法上使用 @PreAuthorize("permitAll") 的解决方案,只是为了看看这是否可行。虽然不要求安全作为授予对象设置域对象特权的特权,但它至少会让我继续前进。但不高兴,我继续收到“accessDenied for class”错误,大概是因为当前用户是第二个用户,而不是域对象所有者。
我需要在这里完成 SpEL 建议吗?不幸的是,我几乎不明白 bean 解析器是如何工作的。
编辑:即使我验证邀请在调用时有效,当尝试插入新用户的第一个 ACE 时,Spring ACL 也会抛出异常。异常发生在 insertAce 调用的 void setPermissions(ObjectIdentity oid, recipient, Collection permissions) 中:
void setPermissions(ObjectIdentity oid,收件人,收集权限){ Sid sid = createSid(收件人)
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
}
我假设访问被拒绝,因为当前用户(发出邀请时不存在)无权设置其他用户拥有的对象的权限。