Keycloak:在 RegistrationProfile class formContext.getUser() 中返回 null

Keycloak: In RegistrationProfile class formContext.getUser() returning null

我正在实施我自己的自定义 RegistrationProfile class,以便根据他在表单中插入的信息授予注册用户特定的角色。

我想在确认表单通过验证后授予角色。 所以我把代码放在 success 方法中:

@Override
public void success(FormContext formContext) {

    UserModel userModel = formContext.getUser();

    MultivaluedMap<String, String> formData = formContext.getHttpRequest().getDecodedFormParameters();

    userModel.setFirstName(formData.getFirst(RegistrationPage.FIELD_FIRST_NAME));
    userModel.setLastName(formData.getFirst(RegistrationPage.FIELD_LAST_NAME));
    userModel.setEmail(formData.getFirst(RegistrationPage.FIELD_EMAIL));

    RoleModel roleModel = formContext.getRealm().getRole("user");

    userModel.grantRole(roleModel);
}

在方法success(FormContext formContext)中当我做formContext.getUser()方法returns一个null.

有人可以帮助我了解为什么以及如何解决这个问题吗?
可能因为注册用户还没有创建,我得到了 null。但是我该如何实例化一个 UserModel?

我找到了解决方案:

由于需要先创建用户,formContext.getUser() 将始终 return null
我必须先创建一个用户然后给他一个角色:

String username = formData.getFirst(RegistrationPage.FIELD_USERNAME);

UserModel user = formContext.getSession().users()
        .addUser(formContext.getRealm(), username);

user.setEnabled(true);

user.grantRole(context.getRealm().getRole("user"));

我的代码受到RegistrationUserCreationclass的success方法的启发。

对我来说这是一个配置问题。

在管理控制台中:
身份验证 -> 流程 -> 选择您的自定义操作

使用向上和向下箭头确保您的自定义操作在“注册用户创建”之后(否则将无法正确创建)。

它也在文档中 https://www.keycloak.org/docs/latest/server_development/index.html#modifying-extending-the-registration-form :

Make sure your FormAction comes after "Registration User Creation" by using the down buttons to move it if your FormAction isn’t already listed after "Registration User Creation"