首页 > 解决方案 > keycloak - 为每个租户/帐户赋予用户不同的权限

问题描述

我们将 Keycloak 用于 SaaS 产品。每个用户都是租户/帐户的一部分,并具有访问此帐户数据的特定角色。角色在 Keycloak 中配置,相关帐户保存为用户的用户属性。

现在我们有了新的要求,让用户可以访问多个帐户。对于这些帐户中的每一个,用户可能具有不同的角色:

User A:
- Account A:
  - ADMIN
- Account B:
  - Reader 
User B
- Account B:
  - Reader
...

我发现了很多关于多租户不同方法的文章,但在这个方向上没有任何内容。大多数文章结合了角色和组。但就我而言,我需要为每个帐户创建一个新组。所以我最终会拥有数千或数百万个组。

现在我的 API 可以根据发布的 JWT 授权请求。理想情况下我可以保留这个。

使这种结构(用户可以访问具有不同角色的多个帐户)到位的最佳方法是什么?这实际上可以使用keycloak吗?

还是我想错了方向?这听起来像是一个相当常见的用例。

已经非常感谢了。

标签: keycloakkeycloak-services

解决方案


角色在 Keycloak 中配置,相关帐户保存为 > 用户的用户属性。

我不确定你为什么需要这个,因为你可以根据用户角色推断出来。

现在我们有了新的要求,让用户可以访问多个帐户。对于这些帐户中的每一个,用户可能具有不同的角色:

如果我完全理解您的问题,我认为可以通过客户级别的角色来解决。例如:

去 :

  • 你的领域;
  • 客户;
  • 账户 A;
  • 角色;
  • 添加角色;
  • 设置角色并保存

在此处输入图像描述

要将角色设置为用户,请转到

  • 你的领域;
  • 用户;
  • 点击用户;
  • 角色映射;
  • 从客户角色下拉列表中选择客户(例如,账户 A)
  • 添加角色;

在此处输入图像描述

现在我的 API 可以根据发布的 JWT 授权请求。理想情况下我可以保留这个。

Account A代表的令牌请求user a如下所示:

  "acr": "1",
  "realm_access": {
    "roles": [
      "offline_access",
      "uma_authorization"
    ]
  },
  "resource_access": {
    "AccountA": {
      "roles": [
        "ADMIN"
      ]
    },
    "AccountB": {
      "roles": [
        "Reader"
      ]
    },
    "account": {
      "roles": [
        "manage-account",
        "view-profile"
      ]
    }
  },

有人可能会说,当从客户端请求令牌时,Account A并不真正关心客户端中的角色Account B。这可以通过使用 Keycloak 的 Scope Feature 来解决。使用此功能,您可以从与当前客户端相关的其他客户端中选择角色。默认情况下,包括所有角色。尽管如此,要过滤角色需要:

  • 你的领域;
  • 客户;
  • 在这种情况下,客户账户 A;
  • 范围;
  • 切换到OFF选项Full Scope Allowed
  • 节省。

在此处输入图像描述

令牌现在的样子:

  "resource_access": {
    "AccountA": {
      "roles": [
        "ADMIN"
      ]
    }
  },

推荐阅读