当前位置: 首页 > 知识库问答 >
问题:

使用Keycloak自定义身份验证

岳出野
2023-03-14

在过去的几周里,我一直在努力掌握KeyClope,这样我就可以实现一种使用遗留提供商(基于Oracle,带有会话表和各种奇怪的东西)对用户进行身份验证的方法。我们计划在不久的将来解决这个问题,但目前我们必须解决这个问题,所以我们的想法是在前线使用KeyClope——利用它提供的主要好处,比如SSO——在需要身份验证的应用程序中省略传统的身份验证提供程序。

我读了一些关于构建自定义OIDC身份提供程序的内容,但对于这样一个简单的身份验证方法交换来说,它看起来很麻烦。

有没有一种更简单的方法(而不是新的OIDC提供程序)来使用KeyClope构建自定义身份验证提供程序?如果是的话,你能给我举个例子或者至少更深入的解释吗?我发现KeyClope文档在实际示例方面非常薄弱,加上我对Auth协议总体知识的缺乏(我已经在研究)。

提前感谢。

共有1个答案

时经纬
2023-03-14

这也是我的组织所承担的。充其量也很棘手。

这个用户存储SPI就是我们采取的路线。我们首先实现了一种基本方法,通过API调用读取远程数据库。在我们的例子中,我们有两个数据库要连接,我们的SPI实现将调用这两个数据库,并统一它们提供给用户的任何数据。

https://www.keycloak.org/docs/latest/server_development/index.html#_user-storage-spi

您可以使用用户存储SPI向Keycloak写入扩展,以连接到外部用户数据库和凭据存储。内置的LDAP和ActiveDirectory支持是该SPI的实际实现。开箱即用,Keycloak使用其本地数据库创建、更新和查找用户并验证凭据。然而,组织通常有现有的外部专有用户数据库,它们不能迁移到Keycloak的数据模型。对于这些情况,应用程序开发人员可以编写用户存储SPI的实现来连接外部用户存储和内部用户对象模型,Keycloak使用该模型登录用户并管理他们。

然后在本节中:https://www.keycloak.org/docs/latest/server_development/index.html#provider-能力接口

如果您仔细检查了UserStorageProvider接口,您可能会注意到它没有定义任何用于定位或管理用户的方法。这些方法实际上是在其他功能接口中定义的,这取决于您的外部用户存储可以提供和执行的功能范围。例如,一些外部存储是只读的,只能执行简单的查询和凭据验证。您只需要为您能够实现的功能实现功能接口。您可以实现这些接口:

该页面下面列出了各种其他接口,您可以根据需要实现这些接口,以提供所需的行为。

org.keycloak.storage.user.UserLookupProvider

如果您希望能够从外部存储登录用户,则需要此接口。大多数(所有?)提供程序实现此接口。

org.keycloak.storage.user.UserQueryProvider

定义用于定位一个或多个用户的复杂查询。如果要从管理控制台查看和管理用户,必须实现此界面。

org。钥匙斗篷。存储使用者用户注册提供商

如果您的提供商支持添加和删除用户,请实现此接口。

org.keycloak.storage.user.UserBulkUpdateProvider

如果您的提供商支持批量更新一组用户,请实现此接口。

org.keycloak.credential.证书

如果提供程序可以验证一个或多个不同的凭据类型(例如,如果提供程序可以验证密码),请实现此接口。

org.keycloak.credential.更新

如果您的提供商支持更新一个或多个不同的凭据类型,请实现此接口。

建议:从他们的github repo中克隆KeyClope源代码,以便更好地理解他们的代码,以及您的实现将如何与他们现有的框架交互。这主要是在调试或弄清楚“到底发生了什么,我的代码没有按我认为应该的方式工作”时有用的。通常是因为使用实现的方式不同,或者没有考虑缓存。克隆源代码很好,因为它还提供了一些有价值的基本实现示例,您可以在“示例”文件夹中找到这些示例。

这是我现在能提供的最好的建议。以下是本机LDAP提供程序实现:

https://github.com/keycloak/keycloak/blob/master/federation/ldap/src/main/java/org/keycloak/storage/ldap/LDAPStorageProvider.java

你可以用它作为参考。

免责声明:我们在KeyClope的3.4版本中进行了这项工作。文档有点不同,当时还有另一个例子是直接在源代码中完成的。最新的master(版本8)在界面级别看起来很相似。

在高水平上,工作将如下所示:

  1. 实现用户存储并提供接口
  2. 创建一个新的身份验证器,或覆盖现有的用户名身份验证器,以便在用户存储提供商提供其自定义功能后自定义任何其他行为

如果只执行步骤1就可以得到你想要的,你可能不需要步骤2。步骤1抽象你的自定义数据库后端,读取用户信息,并将其作为UserModel提供给Keycloak,它将导入到本地数据库中供以后使用。

 类似资料:
  • 我正在尝试实现一个自定义密钥克拉克身份验证器SPI,用于针对外部数据源/REST服务进行身份验证。计划是将它们迁移到Keycloak。 成功后,在keycloak数据源上创建用户。 创建自定义映射器以在令牌上添加额外的用户属性。 我正在遵循官方指南https://www.keycloak.org/docs/latest/server_development/index.html#_auth_spi

  • 里格斯, Kim Zeevaarders荷兰

  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 问题内容: 我可以使用Google帐户在AppEngine中对用户进行身份验证的方式非常好。 但是,我需要使用 自定义的身份验证登录系统 。 我将有一个AppUsers表,其中包含用户名和加密密码。 我阅读了有关gae会话的内容,但在启动应用安全性方面需要帮助。 如何跟踪经过身份验证的用户会话?设置cookie? 初学者。 问题答案: 您可以使用cookie来做到这一点……其实并不难。您可以使用C

  • 我在spring MVC项目中实现了一个自定义身份验证提供程序。在我自己的重载authenticate()方法中,我实现了自己的身份验证,其中我构造了自己的UserPasswordAuthenticationToken()并返回对象。 现在,上述对象“UserPasswordAuthentictionToken”中的用户ID被匿名化,密码为null,权限设置为授予该用户的权限。 问题: 这是否会导

  • 我试图在一个反应式Spring Boot应用程序中配置一个Spring Security性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建用户名密码身份验证令牌(身份验证),并手动进行身份验证。 但是,在执行此操作时,应用程序似乎无