这里的建议将深表感谢。
我们使用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
}
我认为访问被拒绝是因为当前用户(在发出邀请时不存在)没有权限为另一个用户拥有的对象设置权限。
答案 0 :(得分:0)
您不仅可以将Role
类用于通用角色(Admin
,User
等),还可以用于特定于应用的角色。只需允许用户为资源创建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,我这样做如下:
创建一个特定的角色,允许受邀用户充当管理员以访问受保护对象。在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) }
在config.groovy中确保该角色可以更改目标object:grails.plugins.springsecurity.acl.authority.changeAclDetails = 'ROLE_RUN_AS_INVITED_USER'
在config.groovy中启用RunAs
grails.plugins.springsecurity.useRunAs = true grails.plugins.springsecurity.runAs.key = [key]
注释服务方法
@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