首页 > 解决方案 > 如何在每次社交登录时自动更新用户属性

问题描述

假设我已经实现了一个新的社交登录 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 源代码?

登录流程:自动创建和自动链接

完整的代码可以在这里找到:https ://github.com/kkzxak47/keycloak-services-social-wechatwork/blob/master/src/main/java/org/keycloak/social/wechat/WechatWorkIdentityProvider.java

我正在使用 Keycloak 6.0.1

谢谢!

标签: javaoauth-2.0wildflykeycloakopenid-connect

解决方案


解决了。

通过在自定义提供程序中添加以下代码,我设法实现了我的目标。

    @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));
    }

推荐阅读