2014-01-27 29 views
0

我正在使用Spring Security ACL。当我保存一个对象时,我还创建了一个新的ACE(访问控制条目)。我用这个方法:在Spring Security中授予权限Acl

acl.insertAce(acl.getEntries().size(), BasePermission.CREATE, recipient, true); 

我想知道如果我这样做是正确的时候我调用此方法一个时刻为货主(即增加它的身份验证的用户)应具备的所有权限和同为当局?

例子:

如果谁添加条目也应该具有读访问权的用户我调用此一次:

acl.insertAce(acl.getEntries().size(), BasePermission.READ, recipient, true); 

等等?这是它应该被正确使用的方式吗?

这是正常的,既有权威机构和校长在ACL或只是校长。我的意思是,你混在@PreAuthorizehasRole('ROLE_ADMIN')hasPermission(...)或者你有在ACL两校长和主管部门,所以你只能使用hasPermission(...)

回答

1

默认情况下,当Spring Security的ACL评估将采取许可考虑更高的权限。例如,如果您具有CREATE(2)权限,则自动表示您具有READ(1)权限。出于某种原因,我很难找到这个特定的查询,这是他们的默认策略impls之一。因此,在创建权限后,您不必授予读取权限。

至于结合角色和权限检查,完全正常的做。例如,在我的应用系统中,管理员(ROLE_ADMIN)是可以做任何事情的超级用户,例如,更新其他用户的数据,所以这里是我如何检查当前用户可以更新实体,其中#entity是要更新的实际对象:

@PreAuthorize("hasPermission(#entity, 'ADMINISTRATION') or hasRole('ROLE_ADMIN')") 

如果你想更细粒度的权限,你可以使用安全组。例如,在我的应用程序中,用户宣传他们教授的不同课程,可以在全球范围内教授课程([email protected]可以在任何地方教授课程),在健身房级别(任何123号健身房的教练都可以教这门课)健身教练级别([email protected]可以在健身房ID 123教授此课程)。为了支持这样的事情,你需要有3个级别的权限:

全球:[email protected] - >这是一个SidPrincipal

健身房:GYM_123_TRAINERS - >这是一个GrantedAuthoritySid

健身房,教练:[email protected] - >这是一个GrantedAuthoritySid

当,我遍历所有,他任教于体育馆用户登录并添加GYM_ID_TRAINERS作用,以确定他为部分健身房教练组,以及GYM_ID_TRAINERS-用户名角色在该健身房中将他标识为他。

+0

谢谢。一个问题,但。你是否在'acl_entry'表中插入了一个用于ROLE_ADMIN的ACE,即使你使用'hasRole('...')'? – LuckyLuke

+0

我个人不会将ROLE_ADMIN插入到acl_entry中。如果您选择将其插入到acl_entry表中,则可以跳过此检查“hasRole('ROLE_ADMIN')”。如果你的用户是'ROLE_ADMIN',那么他将在他授权的权限列表中出现这个角色 - 这是Spring Security ACL在评估有权时要检查的内容(#entity,'ADMINISTRATION') - 它会做与通过调用hasRole来手动检查它。 – SergeyB

+0

Okey,谢谢。我会尽你所能去做,如果由于某种原因,我会稍后改变:) – LuckyLuke