keycloak~使用自定義的註冊頁

张占岭發表於2024-07-12

新增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

配置登錄檔單

選擇新的註冊流程

相關文章