我有一个应用程序,单个用户可以在多个公司的环境中工作。我们称这种连接(用户<->公司)为许可。此许可证中的每一个可以具有不同的权限/角色集。我们希望用户只登录一次,然后他可以在应用程序内更改许可,而无需再次输入密码。
到目前为止,我们只有一个应用程序,并将整个权限模型保留在我们自己的数据库中。不幸的是,现在我们必须支持应该继承这些许可证的第二个申请。我想知道是否可以将该模型移至密钥斗篷,这样我们就不必将其复制到每个数据库并手动保持同步。
我已经搜索了有关此主题的密钥库文档,但没有发现所有信息,这似乎很奇怪,因为我认为我们不是第一个使用多上下文应用程序的人。
所以现在我问是否可以在密钥斗篷中配置我们的模型,如果可以,该怎么做?最终还有其他选择吗?我想我可以提供该模型作为具有json结构的声明,但是我觉得不合适。我当时在考虑可以根据数据库提供此类声明的自定义IDP,因此不会出现拼写错误且重复次数较少,但我认为应该有更好的方法。
答案 0 :(得分:1)
您可以尝试编写自己的Keycloak提供程序(SPI)。有一个内置的机制可让您在Keycloak上公开REST端点:https://github.com/keycloak/keycloak/tree/master/examples/providers/domain-extension
仅通过传递访问令牌(带有承载值的授权标头),才可以在授权的上下文中调用该REST。在提供者级别(通过实现org.keycloak.services.resource.RealmResourceProviderFactory
和org.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数据源。