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原则,一个类只做一件事

keycloak~AbstractJsonUserAttributeMapper的作用的更多相关文章

  1. 在wildfly中使用SAML协议连接keycloak

    目录 简介 OpenID Connect和SAML SAML的工作流程 在keycloak中使用SAML 准备wildfy和应用程序 简介 我们知道SSO的两个常用的协议分别是SAML和OpenID ...

  2. Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器,包括Spring Security和Spring Boot

    2月14日,Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器. 其中包括Spring Security和Spring Boot的适配器,这意味着今后Keycloak团队将不再提供 ...

  3. if __name__== "__main__" 的意思(作用)python代码复用

    if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog  http://www.dabu.info/if-__-name__ ...

  4. (转载)linux下各个文件夹的作用

    linux下的文件结构,看看每个文件夹都是干吗用的/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基 ...

  5. github中的watch、star、fork的作用

    [转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...

  6. web.xml中welcome-file-list的作用

    今天尝试使用struts2+ urlrewrite+sitemesh部署项目,结果发现welcome-file-list中定义的欢迎页不起作用: <welcome-file-list> & ...

  7. web.xml中load-on-startup的作用

    如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   <servlet-name>dwr-invoker</servlet-name>   <ser ...

  8. SQLSERVER中NULL位图的作用

    SQLSERVER中NULL位图的作用 首先感谢宋沄剑提供的文章和sqlskill网站:www.sqlskills.com,看下面文章之前请先看一下下面两篇文章 SQL Server误区30日谈-Da ...

  9. 电容与EMC-电容不同功能时对整板EMC的作用

    一般我们的pcb板的器件有很多种类,但是值得特别关注的,很多人都会说是BGA.接口.IC.晶振之类,因为这些都是layout功能模块以及设计难点.然而数量上占绝对优势的器件却是阻容器件,之前围殴阻抗时 ...

  10. FTP的搭建与虚拟目录作用<之简单讲解>

    操作系统:win7 VS2010编写WebService与在IIS的发布<之简单讲解>中我已经说了IIS安装与使用,不明白的可以跳过去看. 1.添加FTP站点 2. 3. 4. 5. zq ...

随机推荐

  1. Django笔记二十四之数据库函数之比较和转换函数

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十四之数据库函数之比较和转换函数 这一篇笔记开始介绍几种数据库函数,以下是几种函数及其作用 Cast 转换类型 Coalesce 优先取 ...

  2. 2023 年十大 API 管理趋势

    本文探讨了 API 管理在数字化转型中的重要性,以及 API 管理面临的挑战和发展机遇.文章重点介绍了十大 API 管理发展趋势,包括 API 安全性.API 标准化.云端 API 管理解决方案.低代 ...

  3. ip addr命令解析

    转载请注明出处: 1.ip addr命令使用解析 ip addr 命令是Linux系统中的一个网络管理工具,用于显示和配置系统中的网络接口及其地址信息.它可以列出系统中所有的网络接口及其详细信息,包括 ...

  4. ArcGIS切片服务获取切片方案xml文件(conf.xml)

    在使用ArcGIS进行影像.地形等切片时,往往需要保持一致的切片方案才能够更好的加载地图服务. 本文介绍如何获取已经发布好的ArcGIS服务的切片方案xml文件. 当然切片xml文件还可以通过工具Ge ...

  5. Albert理论详解:用矩阵分解与跨层参数共享减少参数量

    1.介绍 Albert是Bert的一个变种,它在Bert的基础上减少了参数量,使整个模型更加的"轻量化",同时也保持了Bert的性能,但值得注意的是,Albert虽然显著地减少了参 ...

  6. vue—一个组件调用另一个组件的methods

    这种方法不常用,项目中有个地方共享数据了,起初没用vuex做,后来有个地方不好解决,这两个组件没有什么关系 1.首先同一个vue实例来调用两个方法.所以可以建立一个中转站. 建立 util.js 中转 ...

  7. 在循环内调用 size() 方法的开销大吗?

    for (int i = 0; i < buildings.size(); i++) {} 和 int n = buildings.size(); for (int i = 0; i < ...

  8. 自定义alert、confirm、prompt的vue组件

    Prompt.vue组件 说明: 通过props定制定制的Prompt,可选值 mode 默认值:prompt, 其他模式:confirm.message(简单的提示,可设置提示显示时间,类似aler ...

  9. 2022-08-01:以下go语言代码输出什么?A:panic;B:5;C:6;D:编译错误。 package main import ( “fmt“ ) func main() {

    2022-08-01:以下go语言代码输出什么?A:panic:B:5:C:6:D:编译错误. package main import ( "fmt" ) func main() ...

  10. 基于Gazebo搭建移动机器人,并结合SLAM系统完成定位和建图仿真

    博客地址:https://www.cnblogs.com/zylyehuo/ gazebo小车模型创建及仿真详见之前博客 gazebo小车模型(附带仿真环境) - zylyehuo - 博客园 gaz ...