【问题标题】:Granting permission in Spring Security Acl在 Spring Security Acl 中授予权限
【发布时间】:2014-02-18 18:29:51
【问题描述】:

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

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

我想知道当我为所有者(添加它的经过身份验证的用户)应该拥有的所有权限以及对权限相同的权限调用此方法时是否正确?

例子:

如果添加条目的用户也应该具有 READ 访问权限,我会再调用一次:

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

等等?应该这样用对吧?

在 ACL 中同时拥有权限和委托人或只有委托人是否正常。我的意思是,你是在@PreAuthorize 中混合hasRole('ROLE_ADMIN')hasPermission(...),还是在ACL 中同时拥有主体和权限,所以你只使用hasPermission(...)

【问题讨论】:

    标签: java spring jakarta-ee spring-security acl


    【解决方案1】:

    默认情况下,Spring Security ACL 在评估权限时会考虑更高的权限。例如,如果您具有 CREATE (2) 权限,则自动意味着您具有 READ (1) 权限。出于某种原因,我很难找到那个特定的查询,这是他们的默认策略之一。因此,在授予 CREATE 权限后,您不必授予 READ 权限。

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

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

    如果您想要更细粒度的权限,您可以使用安全组。例如,在我的应用程序中,用户宣传他们教授的不同课程,课程可以在全球级别(user@example.com 可以在任何地方教授此课程)、健身房级别(健身房 ID 123 的任何教练都可以教授此课程)或在健身房教练级别(user@example.com 可以在健身房 ID 123 教授本课程)。为了支持这样的事情,您需要拥有 3 级权限:

    全局:user@example.com -> 这是一个 SidPrincipal

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

    健身教练:GYM_123_TRAINES-user@example.com -> 这是一个 GrantedAuthoritySid

    当用户登录时,我会遍历他教过的所有健身房,并添加 GYM_ID_TRAINES 角色以将他标识为健身房教练组的成员,并添加 GYM_ID_TRAINES-username 角色以将他标识为该健身房的他。

    【讨论】:

    • 似乎没有考虑更高的权限。我已经为用户分配了管理权限,并且读取了该方法的权限级别。除非我将权限级别更改为管理,否则我无法获得调用该方法的权限。我忘记添加选项了吗?
    • 这是不正确的,ACL 没有内置的权限分层检查,所以如果你不授予 READ,那么 CREATE 并不意味着 READ..
    • 那是完全不同的东西,它默认没有实现..你之前说的和这个接口无关,让我说清楚:你说“默认情况下,当 Spring Security ACL评估权限它将考虑更高的权限”这是不正确的,默认情况下,spring ACL 不会那样做,如果您向用户/角色 A 授予 ADMIN 权限,则该用户滚动将不会通过读取访问权限..您必须明确授予也要读取角色,除非(你的类/接口来了)你实现 RoleHierarchyImpl 这也不是默认行为。
    • RoleHierarchyImpl 需要配置且 IT 未配置,并且默认 spring ACL 需要...再次,正如我之前所说,默认 spring ACL 不会按照您所说的方式运行...您是还应该提到用户必须添加 RoleHierarchyImpl 并配置角色层次结构,...
    • spring ACL 需要某些配置更改,但它不需要 RoleHierarchy,没有它也可以正常工作。我没有假设任何事情......我所说的只是你的陈述:“默认情况下,当 Spring Security ACL 评估权限时,它将考虑更高的权限”是错误的。除非您还提到用户还必须添加 RoleHierarchy/RoleHierarchyImpl。并配置层次结构...
    【解决方案2】:

    这个问题背后似乎有许多假设/问题需要解开。我将解释我认为潜在的问题是什么,并添加一些问题来澄清一些可能存在的假设;希望我已经正确理解了这个问题:

    1. 经过身份验证的用户授予权限和获得权限的用户有什么区别?
    2. 经过身份验证的用户需要拥有什么权限才能为其他用户插入 ACE?
    3. 权限是否以某种方式分层?例如。 CREATE 是否比 READ“更强”?
    4. 我可以将hasPermissionhasRole 混合使用吗?

    让我一一回答这些问题。

    认证用户有什么区别授予权限和获得权限的用户?

    首先,当前经过身份验证的用户不一定与我们授予权限的 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中混合hasPermissionhasRole吗?

    正如this answer 正确指出的那样,答案是肯定的。事实上,您可以将任何您喜欢的有效SpEL 表达式放入@PreAuthorize 注释中。它甚至根本不需要与 Spring ACL 相关。

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 2011-11-20
      • 1970-01-01
      • 2013-10-14
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多