Keycloak - пользовательское действие формы не отображается - PullRequest
1 голос
/ 21 марта 2019

Я пытаюсь реализовать пользовательское действие формы для регистрации пользователя. Я добавил в форму несколько пользовательских полей и хочу проверить эти поля. Пройдя документацию по 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

Но когда я перехожу на экран выполнения проверки подлинности, поставщик не указывается. enter image description here

Вот код для настраиваемого действия.

/**
 * 
 */
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();
        }
    }

}

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

1 Ответ

0 голосов
/ 22 марта 2019

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

enter image description here

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

enter image description here

...