首页 > 解决方案 > Keycloak - 如何处理多个工作环境

问题描述

我有一个应用程序,单个用户可以在多个公司的环境中工作。我们称这样的连接(用户<->公司)为许可。这些许可中的每一个都可以具有不同的权限/角色集。我们希望用户只登录一次,然后他可以简单地在应用程序中更改许可,而无需再次输入密码。

到目前为止,我们只有一个应用程序,并将整个权限模型保存在我们自己的数据库中。不幸的是,现在我们必须支持应该继承这些许可的第二个应用程序。我想知道是否可以将该模型移动到 keycloak,这样我们就不必将它复制到每个数据库并手动保持同步。

我已经搜索了有关此主题的 keycloak 文档,但根本没有找到任何信息,这似乎很奇怪,因为我认为我们不是第一个使用多上下文应用程序的人。

所以现在我问是否可以在 keycloak 中配置我们的模型,如果可以,怎么做?最终会有不同的选择吗?我想我可以将该模型作为具有 json 结构的声明提供,但这对我来说并不合适。我正在考虑自定义 IDP,它可以提供基于 DB 的此类声明,因此没有拼写错误和更少的重复,但我觉得应该有更好的方法。

标签: javaspring-securitykeycloak

解决方案


您可以尝试编写自己的 Keycloak 提供程序 (SPI)。有一个内置机制允许您在 Keycloak 上公开 REST 端点:https ://github.com/keycloak/keycloak/tree/master/examples/providers/domain-extension 可以使用授权上下文调用 REST 仅用于例如通过传递 Access-Token(带有承载值的授权标头)。在提供者级别(通过实现:org.keycloak.services.resource.RealmResourceProviderFactoryorg.keycloak.services.resource.RealmResourceProvider),您可以访问用户的 Keycloak 会话和对象 UserModel,如下面的代码所示:

AuthenticationManager.AuthResult authResult = new AppAuthManager().authenticateBearerToken(keycloakSession, keycloakSession.getContext().getRealm());

UserModel userModel = authResult.getUser();

UserModel 类具有获取和设置属性的方法,因此可以在其中存储一些指示当前许可/公司 ID 的信息。您可以使用 Keycloak 上公开的 REST 方法来修改“会话”中的模型(由 Access-Token 表示)。Github 示例还展示了如何从您的自定义提供程序级别使用另一个 Keycloak 提供程序(例如内置 JPA 提供程序),因此使用该方法您可以尝试使用您的许可/公司信息连接到数据库。当然,代表您数据库的数据源也应该注册为 Keycloak 数据源。


推荐阅读