java - 如何在每次社交登录时自动更新用户属性
问题描述
假设我已经实现了一个新的社交登录 privider:
public class WechatWorkIdentityProvider extends AbstractOAuth2IdentityProvider<WechatWorkProviderConfig> implements SocialIdentityProvider<WechatWorkProviderConfig>
需要将此 IdP 的几个属性添加到 keycloak。所以我在中设置了这些属性BrokeredIdentityContext
,详细信息:
@Override
protected BrokeredIdentityContext extractIdentityFromProfile(EventBuilder event, JsonNode profile) {
BrokeredIdentityContext identity = new BrokeredIdentityContext(
(getJsonProperty(profile, "userid")));
identity.setUsername(getJsonProperty(profile, "userid").toLowerCase());
identity.setBrokerUserId(getJsonProperty(profile, "userid").toLowerCase());
identity.setModelUsername(getJsonProperty(profile, "userid").toLowerCase());
identity.setFirstName(getJsonProperty(profile, "email").split("@")[0].toLowerCase());
identity.setLastName(getJsonProperty(profile, "name"));
identity.setEmail(getJsonProperty(profile, "email").toLowerCase());
identity.setUserAttribute(PROFILE_MOBILE, getJsonProperty(profile, "mobile"));
identity.setUserAttribute(PROFILE_GENDER, getJsonProperty(profile, "gender"));
identity.setUserAttribute(PROFILE_STATUS, getJsonProperty(profile, "status"));
identity.setUserAttribute(PROFILE_ENABLE, getJsonProperty(profile, "enable"));
identity.setIdpConfig(getConfig());
identity.setIdp(this);
AbstractJsonUserAttributeMapper.storeUserProfileForMapper(identity, profile, getConfig().getAlias());
return identity;
}
新用户将正确设置和映射移动/性别...,但在此配置发生之前使用 IdP 登录的老用户将不会获得自定义属性。
我的问题是如何在每次用户使用社交 IdP 登录时更新用户属性,无论它是旧用户还是新用户?
是否有另一种方法需要重写,或者需要调用另一个 API,或者我必须修改 keycloak 源代码?
我正在使用 Keycloak 6.0.1
谢谢!
解决方案
解决了。
通过在自定义提供程序中添加以下代码,我设法实现了我的目标。
@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, UserModel user, BrokeredIdentityContext context) {
user.setSingleAttribute(PROFILE_MOBILE, context.getUserAttribute(PROFILE_MOBILE));
user.setSingleAttribute(PROFILE_GENDER, context.getUserAttribute(PROFILE_GENDER));
user.setSingleAttribute(PROFILE_STATUS, context.getUserAttribute(PROFILE_STATUS));
user.setSingleAttribute(PROFILE_ENABLE, context.getUserAttribute(PROFILE_ENABLE));
}
推荐阅读
- flutter - 如何使用颤振在应用程序图标上显示通知徽章?
- javascript - 使用 Google Calendar API 创建 Zoom 会议时出错
- arrays - 为什么 numpy 数组会以这种方式表现
- javascript - 访问和操作对象标签内的 svg 组
- html - 如何在不使用 flexbox 的情况下将“div”拉伸到父级的全高?
- arduino - 如何使用 ESP32 和 Blynk 每 x 天打开和关闭螺线管?
- python - 正则表达式子和熊猫
- javascript - 在 node.js/discord.js 中找不到模块“./data.js”
- reactjs - 为什么 Redux Strore 不添加新条目
- math - 是否有一种算法可以将旋转应用于欧拉角?