如何针对单个应用程序对来自不同领域的用户进行身份验证?
Posted
技术标签:
【中文标题】如何针对单个应用程序对来自不同领域的用户进行身份验证?【英文标题】:How to authenticate users from different realms against a single application? 【发布时间】:2021-10-24 19:03:20 【问题描述】:我有以下情况:
我的应用程序包含一个前端和一个后端微服务,它们都通过一个 keycloak 服务器上的同一领域进行身份验证。此设置已用于开发,但现在我需要扩展它以支持多租户,因为将来每个客户(租户)都应该拥有自己的领域和个人用户帐户。但是,由于在登录之前必须已经知道用户的领域,我想知道这是否可以使用 Keycloak。 另一种方法是为所有租户使用一个领域,并通过组/角色进行映射(用户 - 租户)。但是,这对我来说不是合适的解决方案,因为租户应该无法在 keycloak 中看到彼此的用户帐户。我需要在不同的领域拥有它们。 所以我的问题是,是否有任何解决方案可以针对单个应用程序对来自不同领域的用户进行身份验证?
您的帮助将不胜感激。
【问题讨论】:
您的后端使用什么技术? @sventorben:我正在使用 Java 和 Spring Boot 作为后端服务 你检查过官方的例子吗? github.com/keycloak/keycloak/tree/master/examples/multi-tenant这可能适用于您的情况。 【参考方案1】:这是一个有趣(而且非常经典)的问题,几年前我们也解决了这个问题。
这里有一些有价值的 (?) 想法可以帮助您做出决定。
-
一个重要因素是租户数量。如果您预计会有大量租户,那么在选择“每个租户一个领域”的解决方案时可能会出现严重的性能问题。
尤其是这张票:
https://issues.redhat.com/browse/KEYCLOAK-4593
(最近的版本似乎有一些改进)。
目前的境界限制大概是远小于100境界
...在 SSD 驱动器上使用 mysql 上的 Keycloak 时,每次调用都需要 30 多秒
我现在的基本问题是 keycloak 节点启动.. 有 350 多个租户/领域,我看到 keycloak 的启动超时
另一个元素是想要的用户之间的隔离程度。您的客户是否同意让他们的用户与其他客户混合在同一个“数据库”(即领域)中?他们是否会接受领域管理员能够(通过 Web 控制台)浏览单个领域的所有用户(针对所有租户)的姓名、电子邮件等? 如果没有,每个租户的单独领域是“唯一”解决方案
在我看来,关键问题是:领域的确切语义是什么。上面的票说:
如果您需要为每个子租户以不同方式配置身份提供者、主题、令牌生命周期、密钥轮换等内容,则领域是有意义的。
这应该是主要的决策标准。
关于您的特定问题(例如“我的问题是,是否有任何解决方案可以针对单个应用程序对来自不同领域的用户进行身份验证?”)? 为什么不可能? 技术上 来说,唯一的区别是 Web 服务的根 url 不再是一个常量(具有唯一领域)而是动态的(依赖于租户)。但是,当然,基本假设是系统能够提前(BEFORE login-in)知道相应的领域(可以从登录时选择的租户导出)。
【讨论】:
我们正在处理类似的用例。自定义登录页面等方面的最佳实践是什么,以使 keycloak 了解用户登录的领域。正如原始发布者所说,同一个用户可以是不同领域的一部分(使用相同的用户名),因此登录时的区别至关重要。 系统应该知道适当的领域(例如取决于url,例如/tenant1、/tenant2),ant不一定由最终用户知道。在这种情况下,同一个用户名可以登录多个领域以上是关于如何针对单个应用程序对来自不同领域的用户进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .NET Core Web 应用程序的单个实例中使用动态租户对 Azure Active Directory 中的用户进行身份验证?
多个领域来处理 Spring MVC 和 shiro 中不同 url 集的身份验证
如何在单元测试中针对 Spring Security 对用户进行身份验证