Keycloak如何获取所有未设置密码的用户列表
Keycloak获取未设置密码用户列表的实现方案
Keycloak原生提供对应能力,完全可以实现你需要的筛选逻辑,不需要自行扩展底层存储查询。
- 你预期的
isPasswordSet()判断逻辑没有直接同名方法,可通过凭证管理器的内置方法实现等价判断:调用UserModel的credentialManager()获取凭证管理实例后,用isConfiguredFor(PasswordCredentialModel.TYPE)方法判断用户是否配置过密码类型的凭证,返回false即代表用户未设置密码。 - 该判断逻辑和Keycloak Web管理控制台的用户密码状态展示规则完全一致,和管理页展示的无密码用户状态判定标准对齐。
可直接参考如下实现代码:
import org.keycloak.models.UserModel; import org.keycloak.models.credential.PasswordCredentialModel; import java.util.stream.Stream; Stream<UserModel> unpasswordedUsers = session.users() .getUsersStream(session.getContext().getRealm()) .filter(user -> !user.credentialManager().isConfiguredFor(PasswordCredentialModel.TYPE)); // 后续追加你的业务处理逻辑
注意事项
- 不要混淆「未设置密码」和「需要重置密码」两个状态:后者是用户设置过密码但被标记为下次登录必须重置,和你要筛选的无密码用户是完全独立的状态,用
isConfiguredFor判断不会出现这类误判。 - 版本兼容说明:Keycloak 18及以上版本可直接使用上述
isConfiguredFor方法;17及更早的旧版本没有该方法,可替换为user.credentialManager().getStoredCredentialsByTypeStream(PasswordCredentialModel.TYPE).findAny().isEmpty()实现相同判断。 - 性能提示:如果当前Realm用户规模较大,全量遍历用户流做内存过滤会产生较高性能开销,生产环境可自定义用户存储索引做前置筛选,避免全表扫描。
内容的提问来源于stack exchange,提问作者Janine
相关产品推荐
相关产品推荐

