keycloak~使用自定义的注册页

添加FormAction的实现

package org.keycloak.phone.authentication.forms;

import org.keycloak.Config;
import org.keycloak.authentication.FormAction;
import org.keycloak.authentication.FormActionFactory;
import org.keycloak.authentication.FormContext;
import org.keycloak.authentication.ValidationContext;
import org.keycloak.forms.login.LoginFormsProvider;
import org.keycloak.models.AuthenticationExecutionModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty;

import java.util.List;

// 新版注册
public class RegistrationNew implements FormActionFactory, FormAction {

    public static final String PROVIDER_ID = "new-registration";

    private static AuthenticationExecutionModel.Requirement[] REQUIREMENT_CHOICES = {
            AuthenticationExecutionModel.Requirement.REQUIRED, AuthenticationExecutionModel.Requirement.DISABLED };


    @Override
    public String getDisplayType() {
        return "New Registration Form";
    }

    @Override
    public String getReferenceCategory() {
        return null;
    }

    @Override
    public boolean isConfigurable() {
        return false;
    }

    @Override
    public AuthenticationExecutionModel.Requirement[] getRequirementChoices() {
        return REQUIREMENT_CHOICES;
    }

    @Override
    public boolean isUserSetupAllowed() {
        return false;
    }

    @Override
    public String getHelpText() {
        return "New Registration";
    }

    @Override
    public List<ProviderConfigProperty> getConfigProperties() {
        return null;
    }

    @Override
    public FormAction create(KeycloakSession session) {
        return this;
    }

    @Override
    public void init(Config.Scope config) {

    }

    @Override
    public void postInit(KeycloakSessionFactory factory) {

    }

    @Override
    public void close() {

    }

    @Override
    public String getId() {
        return PROVIDER_ID;
    }

    // FormAction

    @Override
    public void buildPage(FormContext formContext, LoginFormsProvider loginFormsProvider) {
      
    }

    @Override
    public void validate(ValidationContext validationContext) {
        validationContext.success();
    }

    @Override
    public void success(FormContext formContext) {

    }

    @Override
    public boolean requiresUser() {
        return false;
    }

    @Override
    public boolean configuredFor(KeycloakSession keycloakSession, RealmModel realmModel, UserModel userModel) {
        return true;
    }

    @Override
    public void setRequiredActions(KeycloakSession keycloakSession, RealmModel realmModel, UserModel userModel) {

    }
}

注意:对于注册来说,他的页面必须是register.ftl,然后在页面上点"注册"按钮,就会触发这个后台绑定的FormAction,页面会在register.ftl上进行渲染.

主要方法的作用

在 Keycloak 中,自定义 FormAction 是用来扩展认证流程的一种方式。其中,successvalidate 是 FormAction 类中的两个方法,具体作用如下:

  • validate 方法:用于验证用户提交的表单数据是否符合要求。在这个方法中,你可以根据自己的逻辑对用户输入的数据进行验证,比如检查用户名是否唯一、密码强度是否符合要求等。如果验证失败,可以通过抛出异常的方式告知用户并阻止继续注册或登录操作。

  • success 方法:在用户提交的表单数据经过验证通过后,success 方法会被调用。在这个方法中,你可以执行注册用户的逻辑,比如将用户信息保存到数据库中、发送确认邮件等操作。同时,你也可以在该方法中设置一些额外的属性或者执行其他自定义的逻辑。

总结来说,validate 方法用于验证用户提交的数据,确保数据的完整性和正确性;而 success 方法则用于处理验证通过后的逻辑,完成用户注册或登录所需的操作。通过这两个方法的配合,你可以实现自定义的注册逻辑,并且确保注册过程的安全性和可靠性。

regsiter.ftl表单

 <div class="login-box">
        <div class="register-wrap" style="">
            <div class="login-form">
                <div class="edit_btn">
                    <form id="kc-form-login" action="${url.registrationAction}" method="post">
                        手机号:<input type="text" name="phoneNumber">


                        <div class="${properties.kcFormGroupClass!}">
                            <div id="kc-form-options" class="${properties.kcFormOptionsClass!}">
                                <div class="${properties.kcFormOptionsWrapperClass!}">
                                    <span><a href="${url.loginUrl}">${kcSanitize(msg("backToLogin"))?no_esc}</a></span>
                                </div>
                            </div>

                            <div id="kc-form-buttons" class="${properties.kcFormButtonsClass!}">
                                <input class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}" type="submit" value="${msg("doRegister")}"/>
                            </div>
                        </div>

                    </form>
                </div>
            </div>
        </div>
    </div>

注册SPI,类型为FormActionFactory

配置注册表单

选择新的注册流程