在过去的几周中,我一直在尝试掌握Keycloak,因此我可以使用传统的提供程序(基于Oracle的会话表和各种奇怪的东西)来实现对用户进行身份验证的方法。我们计划在不久的将来消除这种情况,但是现在我们必须处理它,所以我们的想法是在第一线使用Keycloak-充分利用它提供的主要好处,例如SSO-省略传统的身份验证提供程序,需要身份验证的应用。
我读了一些有关构建自定义OIDC身份提供程序的信息,但是对于这种简单的auth方法交换来说显得很麻烦。
有没有更简单的方法(而不是新的OIDC提供程序)来使用Keycloak构建自定义身份验证提供程序?如果是这样,您能给我一个例子还是至少有更深层次的解释? 我发现Keycloak文档在实时示例方面非常薄弱,加之我对Auth协议的一般知识不足(我已经在研究)。
谢谢。
答案 0 :(得分:1)
这也是我的组织所做的事情。充其量是棘手的。
此用户存储SPI是我们采用的途径。首先,我们通过API调用从远程数据库中读取内容,从而实现了一种基本方法。在我们的例子中,我们有两个数据库可以连接,而我们的SPI实现将同时调用这两个数据库并统一它们在用户身上提供的任何数据。
https://www.keycloak.org/docs/latest/server_development/index.html#_user-storage-spi
您可以使用用户存储SPI将扩展写入Keycloak,以连接到外部用户数据库和凭证存储。内置的LDAP和ActiveDirectory支持是此SPI的实际实现。开箱即用,Keycloak使用其本地数据库来创建,更新和查找用户并验证凭据。但是,组织通常会拥有现有的外部专有用户数据库,因此无法迁移到Keycloak的数据模型。在这种情况下,应用程序开发人员可以编写User Storage SPI的实现,以桥接Keycloak用于登录和管理用户的外部用户存储和内部用户对象模型。
然后在本节中:https://www.keycloak.org/docs/latest/server_development/index.html#provider-capability-interfaces
如果您仔细检查了UserStorageProvider接口,您可能会注意到它没有定义任何用于定位或管理用户的方法。这些方法实际上是在其他功能接口中定义的,具体取决于外部用户存储可以提供和执行的功能范围。例如,某些外部存储区是只读的,并且只能执行简单的查询和凭据验证。您只需要实现您能够使用的功能的功能接口即可。您可以实现以下接口:
该页面上的后面列出了各种其他接口,您可以根据需要提供这些接口以提供所需的行为。
org.keycloak.storage.user.UserLookupProvider
如果要能够与用户登录,则需要此界面 从这个外部商店。大多数(所有?)提供商都实现了这一点 界面。
org.keycloak.storage.user.UserQueryProvider
定义用于定位一个或多个用户的复杂查询。您 如果要查看和管理用户,必须实现此接口 在管理控制台中。
org.keycloak.storage.user.UserRegistrationProvider
如果您的提供商支持添加和删除,请实施此界面 用户。
org.keycloak.storage.user.UserBulkUpdateProvider
如果您的提供商支持批量更新 用户集。
org.keycloak.credential.CredentialInputValidator
如果您的提供商可以验证一个或多个,则实施此界面 不同的凭证类型(例如,如果您的提供商可以验证 密码)。
org.keycloak.credential.CredentialInputUpdater
如果您的提供商支持更新一个或 更多不同的凭证类型。
推荐:从他们的github存储库中克隆keycloak源代码,以更好地了解他们的代码以及您的实现如何与现有框架交互。首先,这在调试或弄清楚“我的代码无法按我认为的方式工作时到底发生了什么”时很有用。通常是因为实现的使用方式不同或您没有考虑缓存。克隆源代码是件好事,因为它还提供了一些有价值的示例,这些示例可以在examples文件夹中找到。
这是我现在可以提供的最佳建议。这是本机LDAP提供程序实现:
您可以将其用作参考。
免责声明:我们通过Keycloak 3.4版进行了这项工作。文档略有不同,在此过程中直接在源代码中有另一个示例。最新的master(版本8)在界面级别上看起来很相似。
从高层次来看,努力将如下所示:
如果仅实现步骤1就可以得到所需的内容,则可能不需要步骤2。步骤1提取您的自定义数据库后端,并读取用户信息,并将其作为UserModel
的形式提供给Keycloak,并将其导入到本地数据库中以供以后使用。