如何将“帐户”的概念添加到 Keycloak?

问题描述

如何最好地配置 Keycloak 以便用户需要有一个帐户才能让客户端登录到该客户端?

我必须更换专有的 SSO-Impl。它像 Keycloak 一样处理用户、角色和客户端。但是,它也知道帐户。 只有拥有客户帐户的用户才能登录该客户。

在 Keycloak 中,如果用户仅存在于某个领域中,则他可以登录该领域的客户端。不需要其他任何东西。所以不需要“帐​​户”。在旧的应用程序中,他也需要一个帐户。 Keycloak 中的哪些功能最适合克服这种差异?


我有一个想法:

在名为“HasAccount”的每个客户端中创建一个客户端角色并将其分配给用户。然后,如果缺少该角色,则限制访问。 这在这里讨论:“Restrict client access in a single realm with keycloak” 它至少有两个缺点:

  • 它在旧版应用中混合了身份验证和授权。我能理解。但是创建角色已经是一种解决方法。这就是我在这里描述我最初遇到的问题的原因。
  • 我有超过 3 种语言/技术的客户。在那里添加功能似乎比在 Keycloak 中添加的工作要多。

最后一句话:

在你问“这不是单点登录”之前。它仅用于管理目的。管理员可以通过创建或不创建帐户来允许用户登录或不登录用户不必再次登录。如果他登录 App A 并拥有 App B 的帐户,则无需登录即可访问 App B。

解决方法

A user is only allowed to login to a client if he has an account for that client. 实际上不是身份提供者 (IdP) 的任务。它只提供身份,不提供授权。

当然,您也可以忽略它并实施授权。请参阅:User attribute based web service access control by Keycloak

从设计的角度来看,我会在遗留应用程序前面添加身份验证反向代理(但它不是 SPA 应用程序的最佳解决方案)。 Auth 代理将通过 OIDC 协议提供身份验证和授权。旧版应用可能会保留自己的 OIDC 身份验证 - 从用户的角度来看,这将是无缝身份验证,因为将使用 SSO。

Account 实体 - 您可以在 Keycloak 中使用 group 实体而不是原始的 account