keycloak~使用自定义的注册页

敢于对过去告一个段落,才有信心掀开新的篇章! 2024-07-13 08:09:01 阅读 96

添加FormAction的实现

<code>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 >

<div >

<div >

<div >

<form action="${url.registrationAction}" method="post">code>

手机号:<input type="text" name="phoneNumber">code>

<div >

<div >

<div >

<span><a href="${url.loginUrl}">${kcSanitize(msg("backToLogin"))?no_esc}</a></span>code>

</div>

</div>

<div >

<input type="submit" value="${msg("doRegister")}"/>code>

</div>

</div>

</form>

</div>

</div>

</div>

</div>

注册SPI,类型为FormActionFactory

配置注册表单

选择新的注册流程



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。