首页 > 其他分享 >keycloak~使用自定义的注册页

keycloak~使用自定义的注册页

时间:2024-07-12 17:45:51浏览次数:15  
标签:return 自定义 注册 org Override import public 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

配置注册表单

选择新的注册流程

标签:return,自定义,注册,org,Override,import,public,keycloak
From: https://www.cnblogs.com/lori/p/18299061

相关文章

  • 自定义类型:结构体
     一、结构体的声明结构体是一些值的集合,这些值称为成员变量。结构的每个成语可以是不同的类型的变量。1.1结构体变量的创建和初始化结构体的初始化为分为按照结构体成员的顺序初始化和按照指定的顺序初始化1.2结构体的特殊声明在声明结构体的时候,可以不完全的声明如......
  • KU注册链接:如何手动编译Percona Server for MySQL 5.5
    此文由KU注册链接вт989点сс编译原创,随着MySQL8.x版本的陆续更新,Percona的PerconaServerforMySQL也同样支援,不过想要在新的OS(例如DebianLinux12Bookworm)上使用旧版MySQL,Percona已经不提供5.5版DEB安装档,所以藉由此实验在DebianLinux12Bookwor......
  • 易优cms网站user功能:动态显示购物车、登录、注册、退出、会员中心的入口-Eyoucms
    user登录注册入口标签 [基础用法]名称:user功能:动态显示购物车、登录、注册、退出、会员中心的入口;语法:  {eyou:usertype='userinfo'}    <divid="{$field.htmlid}">       <ahref="{$field.loginurl}">登录</a>       <ahref="{$fi......
  • linux-Rsyslog自定义配置json模板
    配置日志接收模板和转发参考:https://www.cnblogs.com/xwupiaomiao/p/17565418.html自定义模板配置文件在主配置文件中添加(rsyslog.conf)include(file=“/etc/rsyslog.d/*.conf”mode=“optional”)方案一在/etc/rsyslog.d/下创建一个配置文件ct3a1.conf#日志模板......
  • rsyslog配置(服务端、客户端)-UDP-TCP转发-imfile自定义应用程序的日志推送
    ##概念#Syslog服务器可以用作一个网络中的日志监控中心,所有能够通过网络来发送日志的设施(包含了Linux或Windows服务器,路由器,交换机以及其他主机)都可以把日志发送给它。通过设置一个syslog服务器,可以将不同设施/主机发送的日志,过滤和合并到一个独立的位置,这样使得你更容易地查......
  • 通过注册表关闭windows11自动更新
    按win+R进入运行界面,并且输入regedit。在注册表中依次展开以下目录HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings右键新建一个DWORD(32位)值。重命名为FlightSettingsMaxPauseDays将基数改为十进制,现在的填入的数值数据就是你要暂停系统更新的天......
  • 【日常记录-Java】自定义进程池
    Author:赵志乾Date:2024-07-12Declaration:AllRightReserved!!!1.简介    服务器上有些进程需要池化管理,使用SpringBoot构建Web服务提供管理api,内部使用自定义的进程池维护已启动的进程;    核心点: 进程池管理的进程都会使用系统的一个端口对外提供服务; ......
  • 演示:【Avalonia-Controls】Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库
    一、目的:分享一个Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库开源地址:GitHub-HeBianGu/Avalonia-Controls:Avalonia控件库Nuget包地址:NuGetGallery|PackagesmatchingHeBianGu.AvaloniaUI.演示视频地址:【Avalonia-Controls】Avalonia工具组件皮肤库v1.0.0_......
  • 最新AI一站式系统源码-ChatGPT商业版系统源码,支持自定义AI智能体应用、AI绘画、AI视频
     一、前言人工智能语言模型和AI绘画在多个领域都有广泛的应用.....SparkAi创作系统是一款基于ChatGPT和Midjourney开发的智能问答和绘画系统,提供一站式AIB/C端解决方案,涵盖AI大模型提问、AI绘画、AI视频、文档分析、图像识别和理解、TTS&语音识别、AI换脸等多项功能。......
  • 多线程中自定义线程池与shiro导致的权限错乱问题解决
    importorg.apache.shiro.SecurityUtils;importorg.apache.shiro.subject.Subject;importorg.apache.shiro.util.ThreadContext;importjava.util.concurrent.*;publicclassShiroAwareThreadPoolExecutorextendsThreadPoolExecutor{publicShiroAwareThread......