Keycloak — пользовательское действие формы не отображается в потоке

Я пытаюсь реализовать пользовательское действие формы для регистрации пользователя. Я добавил несколько настраиваемых полей в форму и хочу проверить эти поля. Изучив документацию по keycloak, я понял, что мне нужно

  • Расширение FormAction, FormActionFactory
  • Упакуйте actionfactory в META-INF/services/org.keycloak.authentication.FormActionFactory.
  • Разверните JAR в папке keycloak/standalone/deployments.

Я сделал все шаги и убедился, что провайдер загружается. Вот журнал из файла журнала keycloak

15:35:29,962 WARN  [org.keycloak.services] (ServerService Thread Pool -- 46) KC-SERVICES0047: organization-field-validation-action (com.phoenix.keycloak.forms.action.OrganizationFormAction) is implementing the internal SPI form-action. This SPI is internal and may change without notice

Но когда я перехожу к экрану выполнения аутентификации, провайдера нет в списке. Keycloak — пользовательское действие формы не отображается в потоке

Вот код пользовательского действия.

/**
 * 
 */
package com.phoenix.keycloak.forms.action;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.core.MultivaluedMap;

import org.keycloak.Config.Scope;
import org.keycloak.authentication.FormAction;
import org.keycloak.authentication.FormActionFactory;
import org.keycloak.authentication.FormContext;
import org.keycloak.authentication.ValidationContext;
import org.keycloak.events.Details;
import org.keycloak.events.Errors;
import org.keycloak.forms.login.LoginFormsProvider;
import org.keycloak.models.AuthenticationExecutionModel.Requirement;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.utils.FormMessage;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.services.validation.Validation;

/**
 * @author Yogesh Jadhav
 *
 */
public class OrganizationFormAction implements FormAction, FormActionFactory {

    private static final String PROVIDER_ID = "organization-field-validation-action";

    private static Requirement[] REQUIREMENT_CHOICES = { Requirement.REQUIRED, Requirement.DISABLED };

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.provider.Provider#close()
     */
    @Override
    public void close() {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.provider.ProviderFactory#create(org.keycloak.models.
     * KeycloakSession)
     */
    @Override
    public FormAction create(KeycloakSession arg0) {
        return this;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.provider.ProviderFactory#getId()
     */
    @Override
    public String getId() {
        return PROVIDER_ID;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.provider.ProviderFactory#init(org.keycloak.Config.Scope)
     */
    @Override
    public void init(Scope arg0) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.provider.ProviderFactory#postInit(org.keycloak.models.
     * KeycloakSessionFactory)
     */
    @Override
    public void postInit(KeycloakSessionFactory arg0) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.keycloak.authentication.ConfigurableAuthenticatorFactory#getDisplayType()
     */
    @Override
    public String getDisplayType() {
        return "Organization Profile Validation";
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.authentication.ConfigurableAuthenticatorFactory#
     * getReferenceCategory()
     */
    @Override
    public String getReferenceCategory() {
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.authentication.ConfigurableAuthenticatorFactory#
     * getRequirementChoices()
     */
    @Override
    public Requirement[] getRequirementChoices() {
        return REQUIREMENT_CHOICES;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.keycloak.authentication.ConfigurableAuthenticatorFactory#isConfigurable()
     */
    @Override
    public boolean isConfigurable() {
        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.authentication.ConfigurableAuthenticatorFactory#
     * isUserSetupAllowed()
     */
    @Override
    public boolean isUserSetupAllowed() {
        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.provider.ConfiguredProvider#getConfigProperties()
     */
    @Override
    public List<ProviderConfigProperty> getConfigProperties() {
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.provider.ConfiguredProvider#getHelpText()
     */
    @Override
    public String getHelpText() {
        return "Validates organization name and mobile number field.";
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.keycloak.authentication.FormAction#buildPage(org.keycloak.authentication.
     * FormContext, org.keycloak.forms.login.LoginFormsProvider)
     */
    @Override
    public void buildPage(FormContext arg0, LoginFormsProvider arg1) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.keycloak.authentication.FormAction#configuredFor(org.keycloak.models.
     * KeycloakSession, org.keycloak.models.RealmModel,
     * org.keycloak.models.UserModel)
     */
    @Override
    public boolean configuredFor(KeycloakSession arg0, RealmModel arg1, UserModel arg2) {
        return false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.keycloak.authentication.FormAction#requiresUser()
     */
    @Override
    public boolean requiresUser() {
        return false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.keycloak.authentication.FormAction#setRequiredActions(org.keycloak.models
     * .KeycloakSession, org.keycloak.models.RealmModel,
     * org.keycloak.models.UserModel)
     */
    @Override
    public void setRequiredActions(KeycloakSession arg0, RealmModel arg1, UserModel arg2) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.keycloak.authentication.FormAction#success(org.keycloak.authentication.
     * FormContext)
     */
    @Override
    public void success(FormContext arg0) {
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * org.keycloak.authentication.FormAction#validate(org.keycloak.authentication.
     * ValidationContext)
     */
    @Override
    public void validate(ValidationContext context) {
        MultivaluedMap<String, String> formData = context.getHttpRequest().getDecodedFormParameters();
        List<FormMessage> errors = new ArrayList<>();

        context.getEvent().detail(Details.REGISTER_METHOD, "form");
        String eventError = Errors.INVALID_REGISTRATION;

        if (Validation.isBlank(formData.getFirst("user.attributes.companyName"))) {
            errors.add(new FormMessage("user.attributes.companyName", "missingOrganizationNameMessage"));
        }

        if (Validation.isBlank(formData.getFirst("user.attributes.contactPersonMobile"))) {
            errors.add(new FormMessage("user.attributes.contactPersonMobile", "missingContactPersonMobileMessage"));
        }

        if (errors.size() > 0) {
            context.error(eventError);
            context.validationError(formData, errors);
            return;

        } else {
            context.success();
        }
    }

}

Не удалось понять, что здесь пошло не так.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
2 880
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Извинения. Я смотрел на неправильную опцию «Добавить выполнение». Я понял, что у каждой формы также есть соответствующее меню «Действия». В этом меню также есть опция «Добавить выполнение».

После выбора этой опции я мог видеть, что мое действие пользовательской формы отображается в ограниченном списке действий.

Я пытаюсь принять условия для каждого клиента. Как вы думаете, можно ли это сделать с помощью этого подхода или необходимо расширить RequiredActionFactory? stackoverflow.com/questions/62758864

user60108 07.07.2020 17:32

@user60108 user60108 да, в идеале вы должны использовать Required ActionFactory. Это идеальный способ удовлетворить ваши требования.

CuriousMind 12.07.2020 14:32

Другие вопросы по теме