這裏的建議將深受讚賞。Grails中的Spring Security提供授權
我們使用Spring Security域對象安全性來鎖定對Grails應用程序中特定對象的訪問。我們也擴展了權限。我們使用普通的@PreAuthorize註釋來控制對域對象的訪問,這取決於分配給特定用戶的權限。
在這個架構中,我想讓一個用戶能夠邀請第二個用戶加入一個組。爲此,第二個用戶收到第一個用戶加入具有特定權限的組的邀請。第二個用戶可以選擇接受或拒絕邀請。
鑑於域對象屬於第一個用戶,而不是第二個用戶,我怎麼能夠授予第二個用戶對域對象的訪問權限?
我試圖在服務方法上使用@PreAuthorize(「permitAll」)來破解一個解決方案,以查看是否可行。雖然沒有要求安全作爲授予對象特權給域對象設置權限,但它至少會讓我去。但沒有喜悅,我繼續得到「accessDenied for class」錯誤,大概是因爲當前用戶是第二個用戶,而不是域對象所有者。
我需要通過SpEL建議here嗎?我很不明白bean解析器是如何工作的。
編輯:即使當我驗證邀請在調用時有效Spring ACL在嘗試插入新用戶的第一個ACE時會引發異常。
空隙setPermissions(ObjectIdentity進行OID,收件人,收集權限){ 西特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
:在所述insertAce呼叫空隙setPermissions(ObjectIdentity進行OID,收件人,收集權限)時發生的異常
}
我認爲訪問被拒絕,因爲當前用戶(在發出邀請時誰不存在)沒有權限設置其他用戶擁有的對象的權限。
所以@PreAuthorize並沒有真正授權一路下跌到ACL的。要訪問受ACL保護的域對象,需要當前用戶具有訪問權限。所以要麼我徹底破解了ACE插入,要麼我在這個特例中弄清楚瞭如何授予權限。 –
那麼我可以使用RunAs身份驗證替換嗎?看起來它會做這項工作。 http://static.springsource.org/spring-security/site/docs/3.0.x/reference/runas.html –
嗯,它應該工作,但它沒有。我在db中創建了一個新角色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()查詢方法中的當前角色時,我看不到我的新角色集。 –