我正在将Keycloak作为Identity Broker运行,并配置了一个Identity Provider。
当具有来自我的IdP的有效令牌的用户首次访问我的应用程序时,该用户将使用来自令牌的信息在Keycloak中创建。这包括电子邮件,用户名,名字和姓氏。然后,Keycloak将其令牌与该用户信息一起发布。
当同一用户随后登录时,将根据Keycloak数据库中的用户信息来制作Keycloak令牌。
我的问题是这样的:如果用户在IdP上更改其姓氏,我如何配置Keycloak自动更新其记录以匹配IdP令牌上的信息?
答案 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端会更新数据
同步模式决定何时使用映射器同步用户数据。 “强制”在每次使用此身份提供者登录时始终更新用户。