<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      keycloak~自定義注冊流程

      添加register.ftl皮膚

      • resources/iframe/login/register.ftl
      • resources/iframe/login/resources 這里定義靜態文件

      注冊的FormAction

      后面需要在keycloak管理后臺添加它

      package org.keycloak.phone.authentication.forms;
      
      /**
       * 注冊流程.
       */
      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};
        List<FormMessage> errors = new ArrayList<>();
        private KeycloakSession session;
      
        public static String getClientId(FormContext context) {
          if (context.getHttpRequest().getUri().getQueryParameters().containsKey("client_id")) {
            return context.getHttpRequest().getUri().getQueryParameters().getFirst("client_id");
          }
          return null;
        }
      
        @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) {
      
        }
      
        // FormAction
      
        @Override
        public void postInit(KeycloakSessionFactory factory) {
          session = factory.create();
        }
      
        @Override
        public void close() {
      
        }
      
        @Override
        public String getId() {
          return PROVIDER_ID;
        }
      
        @Override
        public void buildPage(FormContext formContext, LoginFormsProvider loginFormsProvider) {
          System.out.println(session.getContext().getUri().getQueryParameters().getFirst("username"));
      
          loginFormsProvider.setAttribute("username",
              session.getContext().getUri().getQueryParameters().getFirst("username"));
          loginFormsProvider.createForm("register.ftl");
        }
      
        @Override
        public void validate(ValidationContext context) {
      
          // context.getSession().setAttribute("realm", context.getRealm());
          System.out.println("注冊用戶,驗證表單");
          MultivaluedMap<String, String> formData = context.getHttpRequest().getDecodedFormParameters();
          String loginType = formData.getFirst("loginType");
          String phoneNumber = formData.getFirst("phoneNumber");
          String email = formData.getFirst("email");
          String username = formData.getFirst("username");
          String locale = Optional.ofNullable(formData.getFirst("kc_locale")).orElse("zh-CN");
          String smsCode;
          if (loginType.equals(LoginType.phone.name())) {
            smsCode = formData.getFirst(SMS_CODE);
            TokenCodeServiceProvider tokenCodeServiceProvider =
                context.getSession().getProvider(TokenCodeServiceProvider.class);
            tokenCodeServiceProvider.validateCode(null, phoneNumber, smsCode);
          } else {
            smsCode = formData.getFirst("emailCode");
            EmailCodeServiceProvider tokenCodeServiceProvider =
                context.getSession().getProvider(EmailCodeServiceProvider.class);
            tokenCodeServiceProvider.validateCode(null, email, smsCode);
          }
      
          if (findUserByUsername(context.getSession().users(), context.getRealm(), username) != null) {
            context.error(Errors.INVALID_REGISTRATION);
            errors.add(new FormMessage(RegistrationPhoneNumber.FIELD_PHONE_NUMBER,
                getMessageFromResource(session, locale, "usernameExists")));
            context.validationError(formData, errors);
            return;
          }
      
          if (loginType.equals("phone") && phoneIsExist(session, phoneNumber)) {
            context.error(Errors.INVALID_REGISTRATION);
            errors.add(new FormMessage(RegistrationPhoneNumber.FIELD_PHONE_NUMBER,
                getMessageFromResource(session, locale, "phoneNumberExists")));
            context.validationError(formData, errors);
            return;
          }
          context.success();
        }
      
        @Override
        public void success(FormContext formContext) {
          MultivaluedMap<String, String> formData = formContext.getHttpRequest().getDecodedFormParameters();
          String loginType = formData.getFirst("loginType");
          String email = formData.getFirst("email");
          String phoneNumber = formData.getFirst("phoneNumber");
          String username = formData.getFirst("username");
      
          formContext.getEvent().detail(Details.USERNAME, username)
              .detail(Details.REGISTER_METHOD, "form");
      
          KeycloakSession session = formContext.getSession();
      
          UserProfileProvider profileProvider = session.getProvider(UserProfileProvider.class);
          UserProfile profile = profileProvider.create(UserProfileContext.REGISTRATION_USER_CREATION, formData);
          UserModel user = profile.create();
          user.setEnabled(true);
      
          if (loginType.equals(LoginType.phone.name())) {
            user.setSingleAttribute(KeycloakUtil.PHONE, phoneNumber);
            user.setSingleAttribute(KeycloakUtil.PHONE_VERIFIED, "true");
            formContext.getEvent().detail(KeycloakUtil.PHONE, phoneNumber);
          }
          if (loginType.equals(LoginType.email.name())) {
            if (!KeycloakUtil.REQUIRED_EMAIL_SUFFIX.contains(KeycloakUtil.getEmailSuffix(email))) {
              user.setEnabled(false);
              user.setEmail(email);
              user.setEmailVerified(true);
              formContext.getEvent().detail("Email", email);
            }
          }
      
          formContext.setUser(user);
          formContext.getAuthenticationSession().setClientNote(OIDCLoginProtocol.LOGIN_HINT_PARAM, username);
          formContext.getEvent().user(user);
          formContext.getEvent().success();
      
          formContext.newEvent().event(EventType.LOGIN);
      
          formContext.getEvent().client(formContext.getAuthenticationSession().getClient().getClientId())
              .detail(Details.REDIRECT_URI, formContext.getAuthenticationSession().getRedirectUri())
              .detail(Details.AUTH_METHOD, formContext.getAuthenticationSession().getProtocol());
          String authType = formContext.getAuthenticationSession().getAuthNote(Details.AUTH_TYPE);
          if (authType != null) {
            formContext.getEvent().detail(Details.AUTH_TYPE, authType);
          }
        }
      
        @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) {
      
        }
      }
      
      

      注冊流程核心方法說明

      • 注意:注冊用戶成功后,會自動登錄,并重寫向到來源頁面
      • buildPage方法:渲染頁面
      • validate方法:表單驗證
      • success方法:提交表單,如果這里要訪問context,realms等上下文,需要由validate方法通過 context.getSession().setAttribute()方法進行數據傳遞

      注冊這個Form Action

      • resources/META-INF/services/org.keycloak.authentication.FormActionFactory

      keycloak后臺配置新的注冊程序

      posted @ 2024-07-29 10:18  張占嶺  閱讀(118)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 成人午夜激情在线观看| 激,情四虎欧美视频图片| 波多野结衣一区二区三区高清av| 无码激情亚洲一区| 国产精品国三级国产专区| 国产一区二区在线有码| 国产综合内射日韩久| 欧美精品在线观看视频| 日韩乱码人妻无码中文字幕视频| 免费人成在线观看成人片| 久久香蕉国产线看观看精品yw| 玖玖在线精品免费视频| 亚洲一区二区啊射精日韩| 亚洲一区二区三区在线观看精品中文 | 国内精品久久久久久久97牛牛| 久久99热只有频精品8| 欧美激情 亚洲 在线| 九九在线精品国产| 亚洲中文字幕无码av在线| 亚洲av永久无码精品天堂久久| 精品国产乱码久久久人妻| 欧美成人aaa片一区国产精品| 洞口县| 亚洲国产一区二区三区四| 大地资源中文第二页日本| 波多野结衣av高清一区二区三区| 午夜福利院一区二区三区| 尤物国产精品福利在线网| 国产精品久久精品| 欧美成本人视频免费播放| 亚洲成年av天堂动漫网站| 青青草无码免费一二三区| 中文字幕亚洲综合久久青草| 日本无产久久99精品久久| 日韩精品亚洲国产成人av| 波多野结衣在线精品视频| 男人扒女人添高潮视频| 国产精品自在拍在线播放| 九九热精品免费在线视频| 亚洲AV成人无码久久精品四虎 | 亚洲中文字幕一区二区|