# AbstractJsonUserAttributeMapper 它是一個抽象類,用來更新條件更新用戶屬性(user_attribute)的信息,我們在實現自己的mapper時,需要關註3個方法,下麵分別介紹一下: ## getCompatibleProviders方法 它用來直指你的mapper ...
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());
}
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!