Grails中的Spring Security提供授权

时间:2013-08-21 19:53:18

标签: grails spring-security

这里的建议将深表感谢。

我们使用Spring Security域对象安全性来锁定对Grails应用程序中特定对象的访问。我们也有扩展权限。我们使用普通的@PreAuthorize批注来控制对域对象的访问,具体取决于分配给特定用户的权限。

在此架构中,我希望一个用户能够邀请第二个用户加入群组。为此,第二个用户接收来自第一个用户的邀请以加入具有特定权限的组。第二个用户可以选择接受或拒绝邀请。

鉴于域对象属于第一个用户,而不是第二个用户,我如何使用提供的权限授予第二个用户对域对象的访问权限?

我试图在服务方法上使用@PreAuthorize(“permitAll”)破解解决方案,看看是否可行。虽然不要求安全授予对象权限为域对象设置权限,但它至少会让我继续前进。但是没有快乐,我继续得到“accessDenied for class”错误,大概是因为当前用户是第二个用户,而不是域对象所有者。

我是否需要处理SpEL建议here?不幸的是,我几乎无法理解豆子解析器是如何工作的。

编辑:即使我在调用时验证邀请是有效的,当尝试插入新用户的第一个ACE时,Spring ACL会抛出异常。在insertAce调用中的void setPermissions(ObjectIdentity oid,recipient,Collection permissions)中发生异常:

void setPermissions(ObjectIdentity oid,recipient,Collection permissions){     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

}

我认为访问被拒绝是因为当前用户(在发出邀请时不存在)没有权限为另一个用户拥有的对象设置权限。

2 个答案:

答案 0 :(得分: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)}
    }
}

答案 1 :(得分:0)

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

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

    def inviteRole = SecRole.findByAuthority('ROLE_RUN_AS_INVITED_USER')     if(!inviteRole){         inviteRole = new SecRole()         inviteRole.authority =“ROLE_RUN_AS_INVITED_USER”         inviteRole.save(failOnError:true,flush:true)     }

  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. 注释服务方法

  5. @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