keycloak~AbstractJsonUserAttributeMapper的作用
AbstractJsonUserAttributeMapper
它是一个抽象类,用来更新条件更新用户属性(user_attribute)的信息,我们在实现自己的mapper时,需要关注3个方法,下面分别介绍一下:
getCompatibleProviders方法
它用来直指你的mapper是绑定到哪个认证服务下面的,即这个mapper支持的provider,例如你想在微信登录后执行这个mapper,你就把微信的provider.id写到这个方法里返回它即可
create方法
这个比较简单,主要用来返回当前mapper的实例对象
updateBrokeredUser方法
这是属性绑定的核心方法,用来解析第三方返回的json数据与你用户属性和用户实体里的字段的对应关系,你可以理解为字段映射的过程
实例
- 更新已绑定过的用户的firstName和属性表里的wechat-unionId字段
public class CustomUserAttributeMapper extends AbstractJsonUserAttributeMapper {
public static final String PROVIDER_ID = "custom-user-attribute-mapper";
private static final String[] cp = new String[]{WeiXinIdentityProviderFactory.PROVIDER_ID};
private static final Logger logger = Logger.getLogger(CustomUserAttributeMapper.class);
@Override
public String[] getCompatibleProviders() {
return cp;
}
@Override
public String getId() {
return PROVIDER_ID;
}
// 更新已经绑定过的老用户的属性
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
user.setFirstName(context.getFirstName());
// 扩展属性
user.setSingleAttribute("wechat-unionId", context.getBrokerUserId());
}
@Override
public CustomUserAttributeMapper create(KeycloakSession session) {
logger.info("CustomUserAttributeMapper.create");
return new CustomUserAttributeMapper();
}
}
- 注册这个mapper到SPI容器
# resources/META-INFO/services/org.keycloak.broker.provider.IdentityProviderMapper文件
org.keycloak.broker.provider.IdentityProviderMapper
- 微信扫码之后,我们可以看到用户属性已经加上了
AbstractJsonUserAttributeMapper的好处
- 不需要修改第三方登录的核心逻辑
- 符合OCP原则,对扩展开放
- 符合SRP原则,一个类只做一件事
不使用AbstractJsonUserAttributeMapper
- 代码耦合到AbstractOAuth2IdentityProvider类里,重写它的updateBrokeredUser方法,它只会更新已绑定过的老用户的信息。
@Override
public void updateBrokeredUser(
KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context) {
// 扩展属性
user.setSingleAttribute("unionId", context.getBrokerUserId());
user.setSingleAttribute("latestTime", LocalDateTime.now().toString());
}
合集:
keycloak
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2020-07-17 springboot~DTO字符字段与日期字段的转换问题
2019-07-17 我的那些年(13)~主推微服务架构
2017-07-17 docker~学习笔记索引
2017-07-17 docker~save与load的使用
2013-07-17 知方可补不足~SQL2008中的发布与订阅模式~续
2012-07-17 代码之美~Func让构造方法为属性赋值更灵活