这个问题背后似乎有许多假设/问题需要解开。我将解释我认为潜在的问题是什么,并添加一些问题来澄清一些可能存在的假设;希望我已经正确理解了这个问题:
- 经过身份验证的用户授予权限和获得权限的用户有什么区别?
- 经过身份验证的用户需要拥有什么权限才能为其他用户插入 ACE?
- 权限是否以某种方式分层?例如。
CREATE 是否比 READ“更强”?
- 我可以将
hasPermission 与hasRole 混合使用吗?
让我一一回答这些问题。
认证用户有什么区别授予权限和获得权限的用户?
首先,当前经过身份验证的用户不一定与我们授予权限的 SID 相同。例如,Alice 可能是管理员,他登录并为 SID bob 调用此方法:
acl.insertAce(acl.getEntries().size(), BasePermission.CREATE, bob, true);
在这种情况下,bob 可以是主体,即另一个用户,也可以是权限,即某个角色。为简单起见,我们假设 bob 仅指用户 Bob,即委托人。
认证用户有什么权限需要有才能为其他用户插入 ACE?
让我们继续使用我们的示例,假设 Alice 想要向 Bob 授予权限。 Alice 需要什么权限才能授予 Bob CREATE 权限?那么在 OOTB Spring ACL 中,我们假设您在 ACL 配置中定义了一个授权策略 Bean,如下所示:
@Bean
fun aclAuthorizationStrategy(): AclAuthorizationStrategy {
return AclAuthorizationStrategyImpl(
SimpleGrantedAuthority("ADMIN")
)
}
在这种情况下,我们所说的是任何具有“ADMIN”角色的人都有权对 ACLS 执行任何管理操作,例如授予另一个用户 CREATE 对某些 ACL 的权限。请注意,在这种情况下,拥有“ADMIN”角色会授予对所有 ACL 的管理员访问权限。因此,Alice 可能具有“ADMIN”角色,并且通过上述配置,这意味着她可以将CREATE 授予bob。
但是 Alice 可以通过另一种方式授予权限。她可能对与 ACL 本身相关的对象具有管理访问权限。例如,对象可能是某个BankAccount。在 Spring ACL OOTB 中,BasePermission 实例 ADMINISTRATION 控制是否允许某人对某个对象执行管理操作。请注意,在这种情况下,管理权限仅适用于单个对象,而不是像角色那样在系统范围内。
权限是否以某种方式分层?例如。 CREATE 是否比 READ“更强”?
不,Spring 中默认情况下没有权限层次结构。因此,在撰写此答案时,this answer 是不正确的。
假设你像这样保护一个函数:
@PreAuthorize("hasPermission(#entity, 'WRITE')")
您的意思是“仅允许对该实体具有WRITE 权限的用户访问此功能”。在 OOTB Spring 中,这意味着您需要显式授予用户 WRITE 权限,以便他们能够访问该功能。授予任何其他权限,即使 ADMINISTRATION 也不会解锁对此功能的访问,因为 Spring ACL 只会准确检查 WRITE 权限。注意:这只是 Spring OOTB 行为。您始终可以覆盖权限评估器来做任何您喜欢的事情。因此,如果您想要分层权限,您当然可以通过自定义权限评估器来实现,例如 here。
我可以在@PreAuthorize中混合hasPermission和hasRole吗?
正如this answer 正确指出的那样,答案是肯定的。事实上,您可以将任何您喜欢的有效SpEL 表达式放入@PreAuthorize 注释中。它甚至根本不需要与 Spring ACL 相关。