java - Keycloak - 如何处理多个工作上下文

标签 java spring-security keycloak

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

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

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

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

最佳答案

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

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

UserModel userModel = authResult.getUser();

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

关于java - Keycloak - 如何处理多个工作上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54969260/

相关文章:

java - Android 应用程序不显示来自网络服务器的数据

spring-boot - 了解 spring-security 上的 requestMatchers()

kubernetes - Kong 背后的 Keycloak 和奇怪的重定向

nginx - 在 Keycloak 中从上游读取响应 header 时,上游发送的 header 太大

Java 将对象动态转换为实体

java - 泛型和类转换

java - javax.xml 和 Xerces 支持的可配置属性的完整列表是什么?

java - 如何通过java web服务中的ifsc代码获取银行分行名称

grails - 管理员角色能否在Spring-security ACL Grails中获得其他用户的权限

single-sign-on - 如何使用 SAML ECP 配置文件配置 Keycloak