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

时间:2019-07-31 09:26:58

标签: security vue.js keycloak openid-connect

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

Client role mapping

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

所以我的主要目标是

  • 具有角色Viewer的用户只能登录Viewer Application。如果同一用户尝试访问Operator ApplicationAdmin application,则密钥隐藏仅应拒绝该用户访问。
  • 具有AdminOperator角色的用户应遵循相同的规则。拥有Admin角色的用户应该能够通过keycloak 登录

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

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

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

3 个答案:

答案 0 :(得分:2)

我使用KeyCloak扩展SPI处理了几乎相同的问题。部署之后,您将在身份验证流中使用名为“验证用户角色”的其他可配置“执行”。

然后,身份验证流程如下所示: example auth flow

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

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

答案 1 :(得分:0)

最后在应用程序级别处理了此操作,因为它无法从密钥斗篷端开始工作。

登录后,检查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)) {
    setAuthToken(keycloak.token);
    // Global event bus
    Vue.prototype.$eventBus = new Vue();
    // Injecting to global vue istance
    Vue.prototype.$auth = keycloak;
    Object.freeze(Vue.prototype.$auth);
    // Your app
    new Vue({ // eslint-disable-line no-new
      el: '#app',
      store,
      render: h => h(YourApp)
    });
  } else {
    // Logout user
    keycloak.logout();
  }
}).error(function () {
  keycloak.logout();
});

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

解决方案不是所问问题中所需要的,但它可以工作。尽管我认为这应该在密钥公开级别本身进行处理。

答案 2 :(得分:0)

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

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

最终结果应该类似于: enter image description here

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

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

此外,不要忘记前往您的客户并选择身份验证覆盖中的流程。