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

Posted

技术标签:

【中文标题】Keycloak:用户基于角色的客户端登录访问限制【英文标题】:Keycloak: Role based client log-in access restriction for users 【发布时间】:2019-12-08 18:44:03 【问题描述】:

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

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

所以我的主要目标是,

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

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

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

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

【问题讨论】:

【参考方案1】:

最后在应用程序级别处理了这个问题,因为它在 keycloak 端不起作用。

登录后,检查keycloak 对象,我们可以在上面的问题中找到在配置过程中设置的一些有用的属性。整体代码如下所示,

let appName = 'your_app';
keycloak.init( onLoad: 'login-required' ).success(function () 
  // Confirm the role & authentication of the user
  if (keycloak.authenticated && keycloak.tokenParsed.resource_access &&
      keycloak.tokenParsed.resource_access.hasOwnProperty(appName)) 
    // Continue with the app execution...
   else 
    // Logout user
    keycloak.logout();
  
).error(function () 
  keycloak.logout();
);

通过这种方式,我设法将未经授权的用户排除在应用程序之外。

解决方案不是问题中所要求的,但它有效。虽然我认为这应该在 keycloak 级别本身处理。

【讨论】:

【参考方案2】:

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

身份验证流程如下所示:

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

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

【讨论】:

我使用的 KeyCloak 文档Server Developer Guide 不错!这看起来比在应用程序级别检查角色更合适。【参考方案3】:

你可以在没有扩展的情况下做到这一点。

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

最终结果应该类似于:

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

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

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

【讨论】:

超级有帮助,谢谢 我已经复制了完全相同的流程,但它对我不起作用。一旦用户在用户名密码表单中进行身份验证,子流程就会被忽略并授予访问权限。为了使条件子流起作用,是否需要在 Keycloak 中启用某些功能?谢谢 @Metafr 您是否去客户端并在身份验证覆盖中选择了流程?

以上是关于Keycloak:用户基于角色的客户端登录访问限制的主要内容,如果未能解决你的问题,请参考以下文章

在 keycloak 登录后访问被拒绝。我的 keycloak 服务器中没有任何角色

keycloak,用户注册。如何添加角色?

从 Keycloak 中的 REST API 中提取角色

如何获取访问令牌中的角色:keycloak

Keycloak - 将客户端登录限制为组成员

即使是空角色,Keycloak 也会拒绝访问