Keycloak:用户基于角色的客户端登录访问限制

Sur*_*raj 9 security vue.js openid-connect keycloak

我正在尝试使用 keycloak 实现基于角色的客户端应用程序(VueJS 多页应用程序)控制的相当简单的用例。

客户端角色映射

如图所示,我在单个领域中有三个不同的角色和三个不同的客户端。
图中的箭头代表哪个角色可以访问哪个客户端。

所以我的主要目标是,

  • 具有角色的用户Viewer应该只能登录Viewer Application. 如果同一用户尝试访问Operator ApplicationAdmin application再keycloak应该简单地拒绝这样做此用户。
  • 对于具有AdminOperator角色的用户,应遵循相同的规则。Admin角色的用户应该能够通过 keycloak登录到这些应用程序中的任何一个。

为了实现这个用例,我尝试了以下方法,

  • 首先通过适当的角色映射到用户和在客户端创建角色。在这种情况下,我先创建领域级别角色,然后创建客户端级别角色,然后将适当的角色分配给在用户部分创建的用户。
  • 启用Authorization. 在策略中,我删除了授予所有用户访问客户端的默认策略。并创建User策略和Client策略来限制对客户端应用程序的访问
  • 还尝试了Group基于授权策略。在这种情况下,我创建了一个具有客户端角色的组,然后将用户分配到这些组。并从Authorization组策略启用它们。

但是,不幸的是,这些都不起作用。这意味着我的具有Viewer角色的用户可以登录到我的管理应用程序。这很奇怪。

Stu*_*uck 27

您无需扩展即可执行此操作。

  • 复制所需的流程(例如浏览器流程)
  • 创建一个新的子流程(例如,用于浏览器表单)并调用它Access By Role并选择generic类型。
  • 对于新的子流,请确保CONDITIONAL在流概述中选择它。
  • 对于新的子流程添加执行Condition - User Role,制作REQUIRED并配置它:
    • 别名:管理员角色缺失
    • 角色:管理员(或任何您的角色)
    • 否定:真
  • 添加另一个执行:Deny Access并执行它REQUIRED

最终结果应该与此类似: 在此输入图像描述

如果条件“admin-role-missing”为真,这将拒绝访问。

您还可以从文档中了解更多信息:explicit-deny-allow-access-in-conditional-flows

另外,不要忘记转到您的客户端并选择身份验证覆盖中的流程。

  • 超级有帮助,谢谢 (3认同)
  • @Stuck 我已经寻找这个解决方案好几天了!非常感谢,就像魅力一样 (2认同)

hei*_*ich 20

@Stuck 提出的解决方案是一个很好的开始,但它有一个重大缺陷:当用户已经进行身份验证时,例如通过不需要该角色的另一个客户端的标准流程,将永远不会触发密码表单流程。因此,用户将通过 cookie 流登录,而无需检查角色。

换句话说:如果有其他客户端(例如账户控制台)不需要该角色,任何人都可以绕过角色检查

为了解决这个问题,需要一个额外的流程层,其中包括所有身份验证执行,然后是授权步骤(无论使用什么身份验证流程)。最终结果将如下所示:

在此输入图像描述


小智 5

我使用 KeyCloak 扩展 SPI 解决了几乎相同的问题。部署后,您将在可用的身份验证流程中获得额外的可配置“执行”,名为“验证用户角色”。

身份验证流程如下所示: 示例身份验证流程

此执行必须放在“用户名密码表单”(或其他验证用户身份的表单)之后,否则验证将失败。

源代码在这里: https ://github.com/ValentinChirikov/kc_user_role_validate_extension