根据身份提供者令牌中存在的数据更新Keycloak用户数据

时间:2019-09-12 18:30:09

标签: keycloak

我正在将Keycloak作为Identity Broker运行,并配置了一个Identity Provider。

当具有来自我的IdP的有效令牌的用户首次访问我的应用程序时,该用户将使用来自令牌的信息在Keycloak中创建。这包括电子邮件,用户名,名字和姓氏。然后,Keycloak将其令牌与该用户信息一起发布。

当同一用户随后登录时,将根据Keycloak数据库中的用户信息来制作Keycloak令牌。

我的问题是这样的:如果用户在IdP上更改其姓氏,我如何配置Keycloak自动更新其记录以匹配IdP令牌上的信息?

3 个答案:

答案 0 :(得分:2)

您无需实现自己的IdentityProvider即可实现。相反,只需将类型Attribute Importer的映射器添加到身份提供者。对于采用姓氏的情况,可以从OpenID提供程序应提供的profile客户端作用域之外获取属性值。只需将Claim设置为given_name,并将User Attribute Name设置为firstName,如this screenshot所示。每次使用代理帐户进行的新登录都会导致Keycloak更新该帐户。 (在Keycloak 7.0.1上测试)

答案 1 :(得分:0)

我们想出的解决方案是实现自己的IdentityProvider,该方法扩展了Keycloak的OIDCIdentityProvider以覆盖updateBrokeredUser方法。在此重写的方法中,我们将userModel的姓氏设置为BrokeredIdentityContext中的姓氏(来自IDP的令牌)。像这样:

@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, 
        UserModel user, BrokeredIdentityContext context) {
    user.setFirstName(context.getFirstName());
    user.setLastName(context.getLastName());
    // etc for other user attributes
}

updateBrokeredUser方法的默认实现是禁止操作,因此对我来说很明显,Keycloak打算为此重写以执行类似这样的事情。

我们的自定义身份提供程序类使用提供程序/提供程序工厂机制通过常规方式进行连接。

答案 2 :(得分:0)

将领域的“同步模式”配置为强制,并将 IdP 的“同步模式覆盖”的属性导入映射器配置为强制/继承。每次认证时,如果IdP端有变化,KeyCloak端会更新数据

同步模式决定何时使用映射器同步用户数据。 “强制”在每次使用此身份提供者登录时始终更新用户。