Keycloak:如何串联LDAP与自定义UserStorageProvider执行验证
实现Keycloak先LDAP验证再执行自定义SPI组查询的方案
当然可以实现这种先LDAP验证用户身份、再调用自定义SPI加载SQL Server用户组的流程,以下是具体的操作步骤和注意事项:
1. 调整存储提供程序的优先级与分工
首先要明确两个Provider的职责定位:
- 把你的LDAP用户联合提供程序优先级设为最高(数值最小,比如1),确保Keycloak在认证时第一个尝试它。
- 自定义UserStorageProvider的优先级设为更低(数值更大,比如10),并且让它专注于组查询,不要处理用户认证逻辑。如果你的SPI之前实现了认证相关接口(比如
UserCredentialValidator),要么移除这部分实现,要么在validateCredentials方法里返回null/false,让Keycloak知道这个SPI不负责身份验证,会继续走后续的验证流程(这里就是LDAP)。
2. 优化自定义SPI的实现逻辑
让你的自定义SPI聚焦于组信息的加载:
- 确保实现
UserGroupLookupProvider接口,重写getGroups方法,在这个方法里编写从SQL Server查询用户对应组的业务逻辑。 - 如果需要在用户认证完成后同步组信息,可以额外实现
UserFederatedStorageProvider接口,利用preprocessFederatedIdentity钩子方法,在用户通过LDAP认证后,将SQL Server的组信息附加到用户身份数据中。
3. 控制台配置调整
在Keycloak后台对应Realm的User Federation菜单里完成配置:
- 对于LDAP Provider:确认其Priority是最小的数值,开启Enabled,按需配置用户同步规则(比如只同步必要属性)。
- 对于自定义SPI:开启Enabled,设置好优先级(比LDAP大),如果不需要导入用户到Keycloak本地存储,就把Import Users设为关闭,保持只读模式,避免冗余存储。
4. 验证最终效果
完成配置后,测试用户登录流程:
- 用户输入凭证后,Keycloak会先通过LDAP验证身份。
- 验证通过后,Keycloak会调用自定义SPI的组查询方法,把SQL Server中的用户组添加到用户的身份令牌中。
- 你可以在应用中通过
KeycloakSecurityContext.getToken().getGroups()获取包含LDAP和自定义SPI返回的所有组信息。
注意:如果之前你的自定义SPI和LDAP Provider存在互斥的情况,大概率是因为自定义SPI的优先级更高,或者它处理了认证逻辑导致Keycloak提前终止了验证链。调整后一定要测试整个登录流程,确保组声明正确出现在令牌中。
内容的提问来源于stack exchange,提问作者user1026498
相关产品推荐
相关产品推荐

