Cómo Construir tu Propio Verificador de Autenticación en Liferay DXP

1 de abril de 2024

Los Authentication Verifiers permiten autenticar de forma remota las invocaciones de las APIs de Liferay. Estos componentes tienen dos funciones principales:

  1. Verificar las credenciales a través de los diferentes AuthVerifier.
  2. Crear un contexto de autorización en el portal gracias a los resultados de las verificaciones.

Liferay ofrece diferentes AuthVerifier que podemos utilizar por defecto y que normalmente se adecuan a las necesidades del proyecto. Sin embargo, existen casos en los que necesitemos implementar nuestra propa solución.

En este ejemplo vamos a crear un AuthVerifier que recupere una cabecera con el userId del usuario codificado en base64 y a través del cual permitiremos el acceso a las APIs de Liferay.

Creación del AuthVerifier

Creación del módulo

Lo primero que tenemos que hacer es crear nuestro módulo. Para ello utilizaremos la herramienta de Liferay Blade CLI ejecutando el siguiente comando:

  blade create -t api -p com.mimacom.custom.auth.verifier -c MimacomAuthVerifier custom-auth-verifier

Después de ejecutar el comando veremos que se ha creado el módulo dentro de nuestro Liferay workspace. custom-auth-verifier module

Una vez creado el módulo, al utilizar una plantilla, tenemos que realizar algunas modificaciones:

Completanto la lógica

Ahora ya estamos listos para completar la lógica de nuestro AuthVerifier.

Para ello, abrimos la clase MimacomAuthVerifier realizamos los siguientes pasos:

  1. Declaramos el componente OSGI en nuestra clase e implementamos la interfaz de AuthVerifier:
      @Component(service = AuthVerifier.class)
      public class MimacomAuthVerifier implements AuthVerifier {
         
          @Override
          public String getAuthType() {
              return null;
          }
         
          @Override
          public AuthVerifierResult verify(AccessControlContext accessControlContext, Properties properties) throws AuthException {
              return null;
          }
      }
    
  2. Declaramos la variable que nos dice la cabecera a recuperar de la petición:
       private static final String X_CLIENT_ID_HEADER = "X-Client-Id";
    
  3. Sobreescribimos el método getAuthType:
       @Override
       public String getAuthType() {
           Class<?> clazz = getClass();
           return clazz.getSimpleName();
       }
    
  4. Completamos el método verify para que lea nuestra cabecera, valide el userId y rcee el contexto de autorización:
       @Override
       public AuthVerifierResult verify(AccessControlContext accessControlContext, Properties properties) throws AuthException {
           AuthVerifierResult authVerifierResult = new AuthVerifierResult();
           HttpServletRequest httpServletRequest = accessControlContext.getRequest();
           String xClientIdHeaderValue = httpServletRequest.getHeader(X_CLIENT_ID_HEADER);
    
           if(nonNull(xClientIdHeaderValue)) {
               try{
                   String userIdStr = new String(decode(xClientIdHeaderValue));
                   long userId = userLocalService.getUser(parseLong(userIdStr)).getUserId();
    
                   authVerifierResult.setUserId(userId);
                   authVerifierResult.setPasswordBasedAuthentication(true);
                   authVerifierResult.setState(AuthVerifierResult.State.SUCCESS);
               }catch (Exception e){
                   throw new AuthException(e);
               }
           }
    
           return authVerifierResult;
       }
    

Ahora que ya tenemos nuestro módulo completo podemos desplegarlo en nuestro servidor de Liferay. Para ello situate en la carpeta del módulo y ejecuta el comando:

   blade depoloy

Revisamos los logs de Liferay para comprobar que el despliegue ha sido correcto: custom-auth-verifier module deployment

Registrando nuestro AuthVerifier

Una vez hemos creado y desplegado nuestro AuthVerifier tenemos que realizar un último paso en el que activamos nuestro AuthVerifier.

Para lograr este último paso tenemos que crear un fichero de configuración llamado com.liferay.portal.security.auth.verifier.internal.tracker.AuthVerifierFilterTracker.config. Este fichero contiene todos los AuthVerifiers habilitados por defecto. Crea el fichero anterior y añade el siguiente contenido:

   default.registration.property=["filter.init.auth.verifier.BasicAuthHeaderAuthVerifier.urls.includes=*","filter.init.auth.verifier.OAuth2RESTAuthVerifier.urls.includes=*","filter.init.auth.verifier.PortalSessionAuthVerifier.urls.includes=*", "filter.init.auth.verifier.MimacomAuthVerifier.urls.includes=*"]

Una vez creado el fichero y añadido nuestro AuthVerifier, despliegalo en tu servidor dentro de la carpeta osgi/configs. Config file deployment sucess

Probando nuestro AuthVerifier

Finalmente nuestro AuthVerifier ya está desplegado y activo, así que podemos probar que funciona. Para ello solo tienes que ejecutar la siguiente petición:

*Acuerdate de cambiar el valor de la cabera por un userId codificado en base64

curl --location 'http://localhost:9090/o/headless-admin-user/v1.0/user-accounts/35823' \
--header 'X-Client-Id: {{userId}}' \
--header 'Cookie: JSESSIONID=F5FDFD29F942AC0AC26CCF4563E47850'

success-request-api.png

Sobre el autor: Esther Abascal Santamaría
Comments
Únete a nosotros