我创建了一个自定义用户存储提供程序,可以根据需要将用户从旧系统迁移到keycloak的本地存储。
迁移用户的所有详细信息都存储在除密码之外的Keycloak中。
userModel.setEmail(email);
userModel.setEnabled(isEnabled);
userModel.setEmailVerified(isEmailVerified);
userModel.setFirstName(firstName);
userModel.setLastName(lastName);
我使用上面的代码来存储用户的所有信息,但我没有找到任何存储密码的方法/类。
有人可以帮我吗?
附:我使用的是Keycloak-3.3.0-Final版本。
您可以使用
session.userCredentialManager().updateCredential(realm, user, UserCredentialModel.password(passwordNew, false));
其中session是您在自定义用户存储提供程序中可以访问的当前KeycloakSession。
感谢Boomer的回答,我设法让它在我的实现中工作,其中isValid函数 - 发送POST请求以验证密码 - 需要触发Keycloak数据库中的密码更新。
@Override
public boolean isValid(RealmModel realm, UserModel user, CredentialInput input) {
if (!supportsCredentialType(input.getType()) || !(input instanceof UserCredentialModel)) return false;
UserCredentialModel cred = (UserCredentialModel)input;
// sending a POST request
Response response = userService.validateLogin(user.getUsername(), new EventivalUserCredentialsDto(cred.getValue()));
boolean isValid = HttpStatus.SC_OK == response.getStatus();
if (isValid) {
// save the password to local (keycloak's native) database
session.userCredentialManager().updateCredential(realm, user, cred);
// unset the federation link to never ask again - Import Implementation Strategy
user.setFederationLink(null);
}
return isValid;
}