新增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 是用來擴充套件認證流程的一種方式。其中,success
和 validate
是 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>