keycloak~AbstractJsonUserAttributeMapper的作用

打印 上一主题 下一主题

主题 902|帖子 902|积分 2706

AbstractJsonUserAttributeMapper

它是一个抽象类,用来更新条件更新用户属性(user_attribute)的信息,我们在实现自己的mapper时,需要关注3个方法,下面分别介绍一下:
getCompatibleProviders方法

它用来直指你的mapper是绑定到哪个认证服务下面的,即这个mapper支持的provider,例如你想在微信登录后执行这个mapper,你就把微信的provider.id写到这个方法里返回它即可
create方法

这个比较简单,主要用来返回当前mapper的实例对象
updateBrokeredUser方法

这是属性绑定的核心方法,用来解析第三方返回的json数据与你用户属性和用户实体里的字段的对应关系,你可以理解为字段映射的过程
实例


  • 更新用户的firstName和属性表里的wechat-unionId字段
  1. public class CustomUserAttributeMapper extends AbstractJsonUserAttributeMapper {
  2.   public static final String PROVIDER_ID = "custom-user-attribute-mapper";
  3.   private static final String[] cp = new String[]{WeiXinIdentityProviderFactory.PROVIDER_ID};
  4.   private static final Logger logger = Logger.getLogger(CustomUserAttributeMapper.class);
  5.   @Override
  6.   public String[] getCompatibleProviders() {
  7.     return cp;
  8.   }
  9.   @Override
  10.   public String getId() {
  11.     return PROVIDER_ID;
  12.   }
  13.   @Override
  14.   public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context) {
  15.     user.setFirstName(context.getFirstName());
  16.     // 扩展属性
  17.     user.setSingleAttribute("wechat-unionId", context.getBrokerUserId());
  18.   }
  19.   @Override
  20.   public CustomUserAttributeMapper create(KeycloakSession session) {
  21.     logger.info("CustomUserAttributeMapper.create");
  22.     return new CustomUserAttributeMapper();
  23.   }
  24. }
复制代码

  • 注册这个mapper到SPI容器
  1. # resources/META-INFO/services/org.keycloak.broker.provider.IdentityProviderMapper文件
  2. org.keycloak.broker.provider.IdentityProviderMapper
复制代码

  • 微信扫码之后,我们可以看到用户属性已经加上了

AbstractJsonUserAttributeMapper的好处


  • 不需要修改第三方登录的核心逻辑
  • 符合OCP原则,对扩展开放
  • 符合SRP原则,一个类只做一件事
不使用AbstractJsonUserAttributeMapper


  • 代码耦合到AbstractOAuth2IdentityProvider类里,重写它的extractIdentityFromProfile方法,再调用AbstractJsonUserAttributeMapper完成持久化
  1.   @Override
  2.   protected BrokeredIdentityContext extractIdentityFromProfile(EventBuilder event, JsonNode profile) {
  3.     String uuionid = getJsonProperty(profile, "unionid");
  4.     BrokeredIdentityContext user = new BrokeredIdentityContext(
  5.         (uuionid != null && uuionid.length() > 0 ? uuionid : getJsonProperty(profile, "openid")));
  6.     user.setUsername(getJsonProperty(profile, "openid"));
  7.     user.setBrokerUserId(uuionid);
  8.     user.setModelUsername(getJsonProperty(profile, "nickname"));
  9.     user.setName(getJsonProperty(profile, "nickname"));
  10.     user.setUserAttribute("latestTime", LocalDateTime.now().toString());
  11.     user.setIdpConfig(getConfig());
  12.     user.setIdp(this);
  13.     AbstractJsonUserAttributeMapper.storeUserProfileForMapper(user, profile, getConfig().getAlias());
  14.     return user;
  15.   }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表