Implementación de la clase CredentialsValidationSecurityCheck

improve this page | report issue

Visión general

Esta clase abstracta amplia ExternalizableSecurityCheck e implementa gran parte de sus métodos para facilitar el uso. Hay dos métodos obligatorios: validateCredentials y createChallenge.
La clase CredentialsValidationSecurityCheck está pensada para que los flujos simples validen credenciales arbitrarias para garantizar el acceso a un recurso. También se proporciona una capacidad incorporada para bloquear el acceso después de un determinado número de intentos.

Este tutorial utiliza el ejemplo de un código PIN grabado en el código para proteger un recurso, y le proporciona al usuario 3 intentos(después de estos tres intentos, la instancia de aplicación cliente se bloquea durante 60 segundos).

Requisitos previos: Asegúrese de leer los tutoriales Conceptos de autorización y Creación de una comprobación de seguridad.

Ir a:

Creación de la comprobación de seguridad

Cree un adaptador Java y añada una clase Java denominada PinCodeAttempts que amplíe CredentialsValidationSecurityCheck.

public class PinCodeAttempts extends CredentialsValidationSecurityCheck {

    @Override
    protected boolean validateCredentials(Map<String, Object> credentials) {
        return false;
    }

    @Override
    protected Map<String, Object> createChallenge() {
        return null;
    }
}

Creación del desafío

Cuando se activa la comprobación de seguridad, envía un desafío al cliente. La devolución de null crea un desafío vacío que puede ser insuficiente en algunos casos.
De forma opcional, puede devolver datos con el desafío, por ejemplo un mensaje de error para mostrar u otros datos que el cliente pueda utilizar.

Por ejemplo, PinCodeAttempts envía un mensaje de error predefinido y el número de intentos restantes.

@Override
protected Map<String, Object> createChallenge() {
    Map challenge = new HashMap();
    challenge.put("errorMsg",errorMsg);
    challenge.put("remainingAttempts",getRemainingAttempts());
    return challenge;
}

La implementación de errorMsg se incluye en la aplicación de muestra.

getRemainingAttempts() se hereda de CredentialsValidationSecurityCheck.

Validación de las credenciales de usuario

Cuando el cliente envía la respuesta del desafío, la respuesta se pasa a validateCredentials como Map. Este método debería implementar su lógica y devolver true si las credenciales son válidas.

@Override
protected boolean validateCredentials(Map<String, Object> credentials) {
    if(credentials!=null && credentials.containsKey("pin")){
        String pinCode = credentials.get("pin").toString();

        if(pinCode.equals("1234")){
            return true;
        }
        else {
            errorMsg = "The pin code is not valid.";
        }

    }
    else{
        errorMsg = "The pin code was not provided.";
    }

    //In any other case, credentials are not valid
    return false;

}

Clase de configuración

También puede configurar un código PIN válido utilizando el archivo adapter.xml y MobileFirst Operations Console.

Cree una nueva clase Java que amplíe CredentialsValidationSecurityCheckConfig. Es importante ampliar una clase que coincida con la clase de comprobación de seguridad padre, para poder heredar la configuración predeterminada.

public class PinCodeConfig extends CredentialsValidationSecurityCheckConfig {

    public String pinCode;

    public PinCodeConfig(Properties properties) {
        super(properties);
        pinCode = getStringProperty("pinCode", properties, "1234");
    }

}

El único método requerido en esta clase es un constructor que pueda manejar la instancia Properties. Utilice el método get[Type]Property para recuperar una propiedad específica del archivo adapter.xml. Si no se encuentra ningún valor, el tercer parámetro define un valor predeterminado (1234).

También puede añadir el manejo de errores en este constructor utilizando el método addMessage:

public PinCodeConfig(Properties properties) {
    //Make sure to load the parent properties
    super(properties);

    //Load the pinCode property
    pinCode = getStringProperty("pinCode", properties, "1234");

    //Check that the PIN code is at least 4 characters long. Triggers an error.
    if(pinCode.length() < 4) {
        addMessage(errors,"pinCode","pinCode needs to be at least 4 characters");
    }

    //Check that the PIN code is numeric. Triggers warning.
    try {
        int i = Integer.parseInt(pinCode);
    }
    catch(NumberFormatException nfe) {
        addMessage(warnings,"pinCode","PIN code contains non-numeric characters");
    }
}

En la clase principal (PinCodeAttempts), añada los dos métodos siguientes para que puedan cargar la configuración:

@Override
public SecurityCheckConfiguration createConfiguration(Properties properties) {
    return new PinCodeConfig(properties);
}
@Override
protected PinCodeConfig getConfiguration() {
    return (PinCodeConfig) super.getConfiguration();
}

Ahora puede utilizar el método getConfiguration().pinCode para recuperar el código PIN predeterminado.

Puede modificar el método validateCredentials para utilizar el código PIN de la configuración en lugar del valor no modificado.

@Override
protected boolean validateCredentials(Map<String, Object> credentials) {
    if(credentials!=null && credentials.containsKey(PINCODE_FIELD)){
        String pinCode = credentials.get(PINCODE_FIELD).toString();

        if(pinCode.equals(getConfiguration().pinCode)){
            return true;
        }
        else {
            errorMsg = "Pin code is not valid. Hint: " + getConfiguration().pinCode;
        }

    }
    else{
        errorMsg = "The pin code was not provided.";
    }

    //In any other case, credentials are not valid
    return false;

}

Configuración de la comprobación de seguridad

En adapter.xml, añada un elemento <securityCheckDefinition>:

<securityCheckDefinition name="PinCodeAttempts" class="com.sample.PinCodeAttempts">
  <property name="pinCode" defaultValue="1234" description="The valid PIN code"/>
  <property name="maxAttempts" defaultValue="3" description="How many attempts are allowed"/>
  <property name="blockedStateExpirationSec" defaultValue="60" description="How long before the client can try again (seconds)"/>
  <property name="successStateExpirationSec" defaultValue="60" description="How long is a successful state valid for (seconds)"/>
</securityCheckDefinition>

El atributo name debe ser el nombre de la comprobación de seguridad. Establezca el parámetro class a la clase que ha creado previamente.

Un securityCheckDefinition puede contener cero más elementos property. La propiedad pinCode es la que se define en la clase de configuración PinCodeConfig. Las otras propiedades se heredan de la clase de configuración CredentialsValidationSecurityCheckConfig.

De forma predeterminada, si no especifica estas propiedades en el archivo adapter.xml, recibirá los valores que CredentialsValidationSecurityCheckConfig ha establecido:

public CredentialsValidationSecurityCheckConfig(Properties properties) {
    super(properties);
    maxAttempts = getIntProperty("maxAttempts", properties, 1);
    attemptingStateExpirationSec = getIntProperty("attemptingStateExpirationSec", properties, 120);
    successStateExpirationSec = getIntProperty("successStateExpirationSec", properties, 3600);
    blockedStateExpirationSec = getIntProperty("blockedStateExpirationSec", properties, 0);
}

La clase CredentialsValidationSecurityCheckConfig define las propiedades siguientes:

  • maxAttempts: Los intentos están permitidos antes de obtener un error.
  • attemptingStateExpirationSec: Intervalo en segundos durante el cual el cliente debe proporcionar credenciales válidas, y los intentos se cuentan.
  • successStateExpirationSec: Intervalo en segundos durante el cual se mantiene el inicio de sesión correcto.
  • blockedStateExpirationSec: Intervalo en segundos durante el cual se bloquea el cliente después de alcanzar maxAttempts.

Tenga en cuenta que el valor predeterminado para blockedStateExpirationSec se establece en 0: si el cliente envía credenciales inválidas, puede volverse a intentar “0 segundos después”. Esto significa que la función “intentos” queda inhabilitada de forma predeterminada.

Comprobación de seguridad de ejemplo

Descargue el proyecto de Maven de comprobaciones de seguridad.

El proyecto Maven contiene una implementación de CredentialsValidationSecurityCheck.

Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.
Last modified on February 27, 2020