Keycloak - 不调用 UserModelDelegate 设置器
Keycloak - UserModelDelegate setters are not called
我正在使用 Keycloak v4.8.3。
我目前正在尝试使用导入策略实施 UserStorageProvider。我正在关注文档:
https://www.keycloak.org/docs/4.8/server_development/index.html#import-implementation-strategy
这是我的 createAdapter 方法:
protected UserModel createAdapter(RealmModel realm, String username) {
UserModel local = session.userLocalStorage().getUserByUsername(username, realm);
if (local == null) {
local = session.userLocalStorage().addUser(realm, username);
local.setFederationLink(model.getId());
local.setEnabled(true);
local.setFirstName("test");
local.setLastName("test");
}
return new UserModelDelegate(local) {
@Override
public void setUsername(String username) {
System.out.println(username);
super.setUsername(username);
}
@Override
public void setEmail(String email) {
System.out.println(email);
super.setEmail(email);
}
};
}
登录时,将创建用户适配器并将其导入到 keycloak 内部数据库中。当我尝试更改帐户页面上的电子邮件地址时,永远不会调用 setEmail() 方法。 Keycloak 只是更新内部数据库。
我还需要更改外部系统中的电子邮件地址。
我怎样才能使我的外部存储保持同步?
我们当时最终没有实施它,但是当@monzonj 要求它时,我再次调查了这个问题。关键似乎是实现ImportedUserValidation接口
public class CustomUserProvider implements ImportedUserValidation {
/*ImportedUserValidation*/
@Override
public UserModel validate(RealmModel realm, UserModel user) {
return new CustomUser(user);
}
}
public class CustomUser extends UserModelDelegate {
public CustomUser(UserModel delegate) {
super(delegate);
}
@Override
public void setFirstName(String firstName) {
super.setFirstName(firstName);
// Put your code here...
}
}
我不确定这样做是否正确,但快速测试表明,当您尝试在帐户管理页面上更改您的名字时,这将调用 setter。
编辑:我们现在使用 keycloak v8.0.2
我正在使用 Keycloak v4.8.3。
我目前正在尝试使用导入策略实施 UserStorageProvider。我正在关注文档:
https://www.keycloak.org/docs/4.8/server_development/index.html#import-implementation-strategy
这是我的 createAdapter 方法:
protected UserModel createAdapter(RealmModel realm, String username) {
UserModel local = session.userLocalStorage().getUserByUsername(username, realm);
if (local == null) {
local = session.userLocalStorage().addUser(realm, username);
local.setFederationLink(model.getId());
local.setEnabled(true);
local.setFirstName("test");
local.setLastName("test");
}
return new UserModelDelegate(local) {
@Override
public void setUsername(String username) {
System.out.println(username);
super.setUsername(username);
}
@Override
public void setEmail(String email) {
System.out.println(email);
super.setEmail(email);
}
};
}
登录时,将创建用户适配器并将其导入到 keycloak 内部数据库中。当我尝试更改帐户页面上的电子邮件地址时,永远不会调用 setEmail() 方法。 Keycloak 只是更新内部数据库。
我还需要更改外部系统中的电子邮件地址。 我怎样才能使我的外部存储保持同步?
我们当时最终没有实施它,但是当@monzonj 要求它时,我再次调查了这个问题。关键似乎是实现ImportedUserValidation接口
public class CustomUserProvider implements ImportedUserValidation {
/*ImportedUserValidation*/
@Override
public UserModel validate(RealmModel realm, UserModel user) {
return new CustomUser(user);
}
}
public class CustomUser extends UserModelDelegate {
public CustomUser(UserModel delegate) {
super(delegate);
}
@Override
public void setFirstName(String firstName) {
super.setFirstName(firstName);
// Put your code here...
}
}
我不确定这样做是否正确,但快速测试表明,当您尝试在帐户管理页面上更改您的名字时,这将调用 setter。
编辑:我们现在使用 keycloak v8.0.2