• 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());
      }
    
  • 相关阅读:
    从零开始学习:如何使用Selenium和Python进行自动化测试?
    学习编程的基本步骤
    LM(大模型)应用开发利器之LangChain,带你走进AI世界
    急诊与灾难医学-重点以及习题
    LeetCode每日一题——672. 灯泡开关 Ⅱ
    ROS学习笔记(四)---使用 VScode 启动launch文件运行多个节点
    Vue样式绑定
    词!自然语言处理之词全解和Python实战!
    Spring MVC拦截器实现用户登录权限验证案例
    聚类集成算法原理
  • 原文地址:https://www.cnblogs.com/lori/p/17559814.html