集成LDAP的Keycloak强制生效密码过期策略相关问题咨询
核心问题:Keycloak密码过期策略生效方案
你遇到的密码过期规则不生效问题,核心原因是LDAP用户联邦场景下,Keycloak判断密码过期依赖的「密码最近修改时间」没有被持久化同步,配置调整步骤如下:
- 先确认Realm侧「安全 > 认证 > 密码策略」中的*密码过期(天)*规则配置正确,数值符合你的预期。
- 在LDAP中新增一个自定义时间戳类型字段(例如命名为
keycloakPwdLastModified),用于存储密码修改时间。 - 回到Keycloak的LDAP用户联邦Mapper配置页,新增一个
user-attribute-ldap-mapper:- 用户属性字段填
passwordLastChanged - LDAP属性字段填你刚才新增的LDAP自定义字段
- 映射方向选择双向同步,读取权重设为高于Keycloak本地存储
- 用户属性字段填
- 关闭LDAP侧自带的密码过期策略,避免双策略冲突,所有密码规则统一由Keycloak管控即可。
- 存量用户如果需要补全密码修改时间,可以调用Keycloak Admin API的
GET /{realm}/users/{userId}/credentials接口获取已有密码的创建时间,批量同步到LDAP对应字段即可。
附带问题解答
1. 密码最近修改时间的存储位置
- Keycloak本地存储在数据库的
credential表中,筛选credential_type = 'password'的记录,created_date字段存储的就是密码最近修改的毫秒级时间戳。 - 管理界面默认不展示该属性,两种查询方式:
- 调用Admin API:
GET /{realm}/users/{userId}/credentials,返回结果中password类型凭证的createdDate即为对应时间 - 配置对应的用户属性Mapper将该字段映射到用户属性列表,即可在UI的用户详情页直接查看。
- 调用Admin API:
2. 是否需要将密码修改时间同步到LDAP
你当前的配置场景下必须同步:你开启了Import Users开关,用户每次登录时Keycloak都会从LDAP拉取最新用户属性覆盖本地缓存,如果密码修改时间只存在Keycloak本地,会在用户下次登录时被清空,导致过期判断逻辑没有时间依据无法触发。
3. 是否需要额外配置密码相关Mapper
必须新增passwordLastChanged对应的用户属性Mapper,你当前已配置的Mapper列表中未覆盖该字段,这就是密码过期规则不生效的核心诱因。密码本身不需要额外配置Mapper,你已开启的Enable the LDAPv3 Password Modify Extended Operation已经可以支持Keycloak向LDAP同步密码变更。
内容的提问来源于stack exchange,提问作者Erick G. Hagstrom
相关产品推荐
相关产品推荐

