Keycloak 提供者和用户存储

Posted

技术标签:

【中文标题】Keycloak 提供者和用户存储【英文标题】:Keycloak provider and user storage 【发布时间】:2016-08-31 10:02:17 【问题描述】:

我有一个正在运行的 java ee 应用程序,现在我想将 keycloak 集成为身份验证服务器。我唯一遇到的麻烦是用户存储。我想在我的 java 应用程序中拥有所有用户数据。

现在的问题: 如果用户在 keycloak 前端注册,我的 java 应用程序不知道用户已经注册,所以我无法创建新实体。我发现 keycloak 能够加载一些自定义模块 (https://keycloak.github.io/docs/userguide/keycloak-server/html/providers.html) 但我没有找到任何示例。

有什么解决方案可以让keycloak在用户注册时通知我的java应用程序?

【问题讨论】:

【参考方案1】:

您必须实现自定义身份验证 SPI(在您在应用程序上创建用户的 success() 方法中)、部署它并将其添加到注册流程中

Keycloak 文档:Link

【讨论】:

【参考方案2】:

我遇到了同样的问题,我已经使用过滤器解决了它。我只是检查主体是否存在,如果不存在,我将其插入我的应用程序数据库:

KeycloakSecurityContext ctx = (KeycloakSecurityContext)request.getAttribute(KeycloakSecurityContext.class.getName()); User userEntity = em.find(User.class, ctx.getToken().getSubject()); if (userEntity == null) ....create user... 您还可以使用Example Event Listener that prints events to System.out 中所示的事件侦听器 (keycloak events listener),但对于这个确切的用例,该解决方案更简单、更快捷。

【讨论】:

我最终做了同样的事情。可悲的是,我仍然必须使用其余的管理员 api 来更新用户角色。 可以自动使用某些角色。但是,我认为使用 admin api 没有任何问题。我还需要它进行系统和性能测试 这个过滤方法什么时候被调用?

以上是关于Keycloak 提供者和用户存储的主要内容,如果未能解决你的问题,请参考以下文章

在 Keycloak SPI/Provider 中获取当前用户访问令牌(初始登录时)

Keycloak 自定义用户联合和身份提供者工作顺序

Keycloak:如何仅通过身份提供者登录

KeyCloak 中的自定义提供程序,可以根据用户名和密码进行身份验证

Keycloak:在社交身份提供者登录时传递自定义用户属性

带有外部身份提供者的 Keycloak 失败