Cómo Construir tu Propio Verificador de Autenticación en Liferay DXP
Los Authentication Verifiers permiten autenticar de forma remota las invocaciones de las APIs de Liferay. Estos componentes tienen dos funciones principales:
- Verificar las credenciales a través de los diferentes AuthVerifier.
- 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.
Una vez creado el módulo, al utilizar una plantilla, tenemos que realizar algunas modificaciones:
- Modificar el paquete por defecto que se ha creado. Para ello, hacemos click derecho sobre el paquete y seleccionamos la opción
Refactor -> Rename
y eliminamos el paqueteapi
. - Modificar la interfaz creada por la plantilla
MimacomAuthVerifier
cambiandola por una clase Java. - Eliminar la carpeta resources ya que no vamos a necesitarla en el ejemplo.
- Modificamos el fichero
bnd.bnd
y eliminamos el atributo Export-Package.
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:
- 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; } }
- 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";
- Sobreescribimos el método
getAuthType
:@Override public String getAuthType() { Class<?> clazz = getClass(); return clazz.getSimpleName(); }
- 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:
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
.
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'