如何在Keycloak自定义用户存储提供者中获取原始大小写用户名输入
解决方案
默认Keycloak的核心逻辑会在调用用户存储查询接口前,对用户名做小写转换,所以getUserByUsername的入参肯定是处理后的值,无法直接通过该入参拿到原始输入,你可以通过以下轻量方案获取原始大小写用户名:
方法:从当前请求上下文中提取原始输入
你可以在getUserByUsername方法内,从Keycloak的会话上下文里拿到当前HTTP请求的原始参数,操作步骤如下:
- 先获取当前请求实例
HttpRequest request = session.getContext().getContextObject(HttpRequest.class);
- 直接提取用户提交的原始用户名字段
String rawUsername = request.getDecodedFormParameters().getFirst("username");
拿到的rawUsername就是用户输入的原生大小写字符串,直接用这个值去你的业务数据库做大小写敏感的用户查询即可。
注意事项
- 记得对
rawUsername做非空校验,避免非登录场景调用该接口时出现空指针异常 - 如果是通过OAuth2授权接口发起的登录请求,
username参数同样可以通过该方式获取到原始值 - 查询到匹配的用户后,返回的
UserModel实例的getUsername方法建议返回数据库存储的原生大小写用户名,避免后续其他业务逻辑出现数据不一致 - 该方案不需要修改Keycloak核心配置,改造成本极低,适配自定义用户存储的所有场景
内容的提问来源于stack exchange,提问作者lio
相关产品推荐
相关产品推荐

