Implementación del ExternalizableSecurityCheck

improve this page | report issue

Visión general

La clase abstracta ExternalizableSecurityCheck implementa la interfaz SecurityCheck y maneja dos aspectos importantes de la funcionalidad de comprobación de seguridad: externalización y gestión de estado.

  • Externalización - esta clase implementa la interfaz Externalizable, para que no tengan que implementarse las clases derivadas.
  • Gestión de estado - esta clase predefine un estado STATE_EXPIRED, lo que significa que la comprobación de seguridad ha caducado y el estado no se conserva. Las clases derivadas necesitan definir otros estados que la comprobación de seguridad soporta.

Es necesario que las subclases implementen tres métodos: initStateDurations, authorize, e introspect.

Este tutorial describe cómo implementar la clase y muestra cómo gestionar estados.

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

Ir a:

El método initStateDurations

El ExternalizableSecurityCheck define un método abstracto llamado initStateDurations. Las subclases deben implementar este método proporcionando los nombres y duraciones para todos los estados soportados por la comprobación de seguridad. Los valores de duración normalmente provienen de la configuración de comprobación de seguridad.

private static final String SUCCESS_STATE = "success";

protected void initStateDurations(Map<String, Integer> durations) {
    durations.put (SUCCESS_STATE, ((SecurityCheckConfig) config).successStateExpirationSec);
}

Para obtener más información acerca de la configuración de comprobación de seguridad, consulte la sección de clase de configuración en el tutorial de implementación de CredentialsValidationSecurityCheck.

El método authorize

La interfaz SecurityCheck define un método denominado authorize. Este método es el responsable de implementar la lógica principal de la comprobación de seguridad, de gestionar estados y enviar una respuesta al cliente (acierto, desafío o error).

Utilice los métodos de ayudante siguientes para gestionar estados:

protected void setState(String name)
public String getState()

El siguiente ejemplo verifica si el usuario ha iniciado sesión o devuelve acierto o error en consecuencia:

public void authorize(Set<String> scope, Map<String, Object> credentials, HttpServletRequest request, AuthorizationResponse response) {
    if (loggedIn){
        setState(SUCCESS_STATE);
        response.addSuccess(scope, getExpiresAt(), this.getName());
    } else  {
        setState(STATE_EXPIRED);
        Map <String, Object> failure = new HashMap<String, Object>();           
        failure.put("failure", "User is not logged-in");
        response.addFailure(getName(), failure);
    }
}

El método AuthorizationResponse.addSuccess añade el ámbito de éxito y la caducidad al objeto de respuesta. Requiere:

  • El ámbito otorgado por la comprobación de seguridad.
  • El vencimiento del ámbito otorgado.
    El método de ayudante getExpiresAt devuelve la hora en la que el estado caduca, o 0 si el estado actual es cero:

    public long getExpiresAt()
    
  • El nombre de la comprobación de seguridad.

El método AuthorizationResponse.addFailure añade un valor de error en el objeto de respuesta. Requiere:

  • El nombre de la comprobación de seguridad.
  • Un objeto Map de error.

El método AuthorizationResponse.addChallenge añade un desafío al objeto de respuesta. Requiere:

  • El nombre de la comprobación de seguridad.
  • Un objeto Map de desafío.

El método introspect

La interfaz SecurityCheck define un método llamado introspect. Este método debe asegurar que la comprobación de seguridad está en el estado que concede el ámbito solicitado. Si se concede el ámbito, la comprobación de seguridad debe informar al parámetro de resultado sobre el ámbito concedido, el vencimiento, y los datos de introspección. Si no se ha concedido el ámbito, la verificación de seguridad no hace nada.
Es posible que el método cambie el estado de la comprobación de seguridad y del registro de registro de cliente.

public void introspect(Set<String> checkScope, IntrospectionResponse response) {
    if (getState().equals(SUCCESS_STATE)) {
        response.addIntrospectionData(getName(),checkScope,getExpiresAt(),null);
    }
}

El objeto AuthorizationContext

La clase ExternalizableSecurityCheck proporciona el objeto AuthorizationContext authorizationContext que se utiliza para almacenar los datos transitorios asociados con el cliente actual para la comprobación de seguridad.
Utilice los métodos siguientes para almacenar y obtener datos:

  • Obtenga el usuario autenticado que la comprobación de seguridad ha establecido para el cliente actual:

    AuthenticatedUser getActiveUser();
    
  • Establezca el usuario activo para el cliente actual con esta comprobación de seguridad:

    void setActiveUser(AuthenticatedUser user);
    

El objeto RegistrationContext

La clase ExternalizableSecurityCheck proporciona el objeto RegistrationContext registrationContext que se utiliza para almacenar los datos de despliegue/persistentes asociados con el cliente actual.
Utilice los métodos siguientes para almacenar y obtener datos:

  • Obtenga el usuario que la comprobación de seguridad ha registrado para el cliente actual:

    AuthenticatedUser getRegisteredUser();
    
  • Registre el usuario proporcionado para el cliente actual:

    setRegisteredUser(AuthenticatedUser user);
    
  • Obtenga los atributos persistentes públicos del cliente actual:

    PersistentAttributes getRegisteredPublicAttributes();
    
  • Obtenga los atributos persistentes protegidos del cliente actual:

    PersistentAttributes getRegisteredProtectedAttributes();
    
  • Encuentre los datos de registro de los clientes móviles de acuerdo con los criterios de búsqueda proporcionados:

    List<ClientData> findClientRegistrationData(ClientSearchCriteria criteria);
    

Aplicación de ejemplo

Para un ejemplo que implementa ExternalizableSecurityCheck, consulte el tutorial Inscripción.

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 March 13, 2018