0

这里的建议将不胜感激。

我们使用 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

}

我假设访问被拒绝,因为当前用户(发出邀请时不存在)无权设置其他用户拥有的对象的权限。

4

2 回答 2

0

Role不仅可以将您的类用于通用角色(AdminUser等),还可以用于特定于应用程序的角色。只需允许用户为资源创建一个Role,然后允许他们的受邀者被授予该角色。Spring Security 带有一个方便的ifAnyGranted()方法,它接受以逗号分隔的角色名称字符串。在资源入口点只需确保授予特定角色:

class Conversation{
     Role role
}
class ConversationController{
    def enterConversation(){
       // obtain conversation instance 
       if(!SpringSecurityUtils.ifAnyGranted(conversationInstance.role.authority){response.sendError(401)}
    }
}
于 2013-08-22T00:11:51.293 回答
0

答案原来是使用 RunAs。对于 Grails,我这样做如下:

  1. 创建一个特定于允许受邀用户充当管理员以访问受保护对象的角色。在 Bootstrap 中,确保将此角色加载到 SecRole 域中:

    def 邀请角色 = SecRole.findByAuthority('ROLE_RUN_AS_INVITED_USER') if (!invitedRole) {受邀角色 = 新 SecRole()

  2. 确保在 config.groovy 中角色可以更改目标object:grails.plugins.springsecurity.acl.authority.changeAclDetails = 'ROLE_RUN_AS_INVITED_USER'

  3. 在 config.groovy 中启用 RunAs

    grails.plugins.springsecurity.useRunAs = true grails.plugins.springsecurity.runAs.key = [key]

  4. 注释服务方法

@PreAuthorize([检查这确实是受邀用户]) @Secured(['ROLE_USER', 'RUN_AS_INVITED_USER'])

这一切都有效。诀窍是让 ROLE_RUN_AS_INVITED_USER 能够更改 acl。

参考: http ://static.springsource.org/spring-security/site/docs/3.0.x/reference/runas.html http://grails-plugins.github.io/grails-spring-security-acl/docs /manual/guide/2.%20Usage.html#2.5%20Run-As%20Authentication%20Replacement

于 2013-09-04T14:34:18.847 回答