Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Laravel 5
Code

Cómo crear un guardia de autenticación personalizado en Laravel

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by CYC (you can also view the original English article)

En este artículo, vamos a cubrir el sistema de autenticación en el Framework de Laravel. El objetivo principal de este artículo es crear una protección de autenticación personalizada extendiendo el sistema de autenticación central.

Laravel proporciona un sistema de autenticación muy sólido en el núcleo que hace que la implementación de la autenticación básica sea muy sencilla. De hecho, solo necesitas ejecutar un par de comandos artisan para configurar el scaffolding de un sistema de autenticación.

Además, el sistema en sí está diseñado de tal manera que podrías ampliarlo y conectar tus adaptadores de autenticación personalizados también. Eso es lo que discutiremos en detalle a lo largo de este artículo. Antes de seguir adelante y profundizar en la implementación de la protección de autenticación personalizada, comenzaremos con una discusión sobre los elementos básicos en el sistema de autenticación de Laravel: guardias y proveedores.

Los elementos principales: guardias y proveedores

El sistema de autenticación de Laravel se compone de dos elementos principales —guardias y proveedores.

Guardias

Podrías pensar en un guardia como una forma de proporcionar la lógica que se utiliza para identificar a los usuarios autenticados. En el núcleo, Laravel proporciona diferentes guardias como sesión y token. El guardia de sesión mantiene el estado del usuario en cada solicitud mediante cookies y, por otro lado, el guardián del token autentica al usuario marcando un token válido en cada solicitud.

Entonces, como puedes ver, el guardia define la lógica de la autenticación, y no es necesario que siempre trate con eso recuperando credenciales válidas desde el back-end. Puedes implementar un guardia que simplemente verifique la presencia de algo específico en los encabezados de solicitud y autentique a los usuarios en función de eso.

Más adelante en este artículo, implementaremos un guardia que verifique ciertos parámetros JSON en los encabezados de solicitud y recupere al usuario válido del back-end de MongoDB.

Proveedores

Si el guardia define la lógica de autenticación, el proveedor de autenticación es responsable de recuperar al usuario del almacenamiento de fondo. Si el guardia requiere que el usuario deba ser validado contra el almacenamiento de back-end, la implementación de recuperación del usuario entra en el proveedor de autenticación.

Laravel se envía con dos proveedores de autenticación predeterminados: base de datos y Eloquent. El proveedor de autenticación de la base de datos se ocupa de la recuperación directa de las credenciales del usuario del almacenamiento de back-end, mientras que Eloquent proporciona una capa de abstracción que hace lo necesario.

En nuestro ejemplo, implementaremos un proveedor de autenticación MongoDB que obtenga las credenciales del usuario desde el back-end de MongoDB.

Entonces esa fue una introducción básica a los guardias y proveedores en el sistema de autenticación de Laravel. A partir de la próxima sección, nos centraremos en el desarrollo del proveedor y protector de autenticación personalizado.

Un vistazo rápido a la configuración del archivo

Echemos un vistazo rápido a la lista de archivos que implementaremos a lo largo de este artículo.

  • config/auth.php: Es el archivo de configuración de autenticación en el que agregaremos una entrada de nuestra guardia personalizada.
  • config/mongo.php: es el archivo que contiene la configuración de MongoDB.
  • app/Services/Contracts/NosqlServiceInterface.php: Es una interfaz que implementa nuestra clase personalizada de base de datos MongoDB.
  • app/Database/MongoDatabase.php: es una clase de base de datos principal que interactúa con MongoDB.
  • app/Models/Auth/User.php: es la clase de modelo de usuario que implementa la declaración Autenticable.
  • app/Extensions/MongoUserProvider.php: es una implementación del proveedor de autenticación.
  • app/Services/Auth/JsonGuard.php: es una implementación del controlador de protección de autenticación.
  • app/Providers/AuthServiceProvider.php: este es un archivo existente que usaremos para agregar nuestros enlaces de contenedor de servicio.
  • app/Http/Controllers/MongoController.php: es un archivo de controlador demo que implementaremos para probar nuestra guardia personalizada.

No te preocupes si la lista de los archivos no tiene mucho sentido aún, ya que discutiremos todo en detalle a medida que avancemos.

Inmersión profunda en la implementación

En esta sección, revisaremos la implementación de los archivos requeridos.

Lo primero que debemos hacer es informar a Laravel sobre nuestra guardia personalizada. Continúa e ingresa los detalles del protector personalizado en el archivo config/auth.php como se muestra.

Como puedes ver, hemos agregado nuestro protector personalizado bajo la clave personalizada.

A continuación, debemos agregar una entrada de proveedor asociada en la sección de proveedores.

Hemos agregado nuestra entrada de proveedor bajo la clave mongo.

Finalmente, cambiemos el protector de autenticación predeterminado de web a personalizado.

Por supuesto, no funcionará aún, ya que aún no hemos implementado los archivos necesarios. Y eso es lo que discutiremos en las próximas secciones.

Configura el controlador MongoDB

En esta sección, implementaremos los archivos necesarios que hablan con la instancia de MongoDB subyacente.

Primero crearemos un archivo de configuración config/mongo.php que contenga la configuración de conexión de MongoDB por defecto.

Por supuesto, debes cambiar los valores del marcador de posición según tu configuración.

En lugar de crear directamente una clase que interactúe con MongoDB, crearemos una interfaz en primer lugar.

El beneficio de crear una interfaz es que proporciona una declaración que un desarrollador debe cumplir al implementarlo. Además, nuestra implementación de MongoDB podría intercambiarse fácilmente con otra implementación de NoSQL si fuese necesario.

Continúa y crea una aplicación de archivo de interfaz app/Services/Contracts/NosqlServiceInterface.php con los siguientes contenidos.

Es una interfaz bastante simple que declara los métodos CRUD básicos que una clase debe definir y que implementa esta interfaz.

Ahora, definamos una clase real en app/Database/MongoDatabase.php.

Por supuesto, supongo que has instalado MongoDB y la extensión de MongoDB PHP correspondiente.

El método __construct instancia la clase MongoClient con los parámetros necesarios. El otro método importante que nos interesa es el método de búsqueda find, el cual recupera el registro según los criterios proporcionados como argumentos de método.

Así que esa fue la implementación del controlador MongoDB, y traté de mantenerlo lo más simple posible.

Configurar el modelo de usuario

Siguiendo los estándares del sistema de autenticación, debemos implementar el modelo de usuario que debe implementar la declaración Illuminate\Contracts\Auth\Authenticatable.

Continúa y crea un archivo en app/Models/Auth/User.php con los siguientes contenidos.

Ya deberías haber notado que App\Models\Auth\User implementa la declaración Illuminate\Contracts\Auth\Authenticatable.

La mayoría de los métodos implementados en nuestra clase son autoexplicativos. Habiendo dicho eso, hemos definido el método fetchUserByCredentials, el cual recupera al usuario mediante el back end disponible. En nuestro caso, será una clase MongoDatabase a la que se llamará para recuperar la información necesaria.

Así que esa es la implementación del modelo de Usuario.

Configurar el proveedor de autenticación

Como mencionamos anteriormente, el sistema de autenticación de Laravel consta de dos elementos: guardias y proveedores.

En esta sección, crearemos un proveedor de autenticación que se ocupará de la recuperación del usuario desde el back-end.

Continúa y crea un archivo en app/Extensions/MongoUserProvider.php como se muestra a continuación.

De nuevo, debes asegurarte de que el proveedor personalizado debe implementar la declaración Illuminate\Contracts\Auth\UserProvider.

Para seguir avanzando, define dos métodos importantes: retrieveByCredentials y validateCredentials.

El método retrieveByCredentials se usa para recuperar las credenciales de usuario utilizando la clase de modelo del usuario, el cual se discutió en la sección anterior. Por otro lado, el método validateCredentials se usa para validar a un usuario contra un conjunto dado de credenciales.

Y esa fue la implementación de nuestro proveedor de autenticación personalizado. En la siguiente sección, procederemos a crear un guardia que interactúe con el proveedor de autenticación MongoUserProvider.

Configurar la Guardia de autenticación

Como mencionamos anteriormente, el guardia del sistema de autenticación de Laravel indica cómo se autentica al usuario. En nuestro caso, verificaremos la presencia del parámetro de solicitud jsondata que debe contener la cadena de credenciales codificada en JSON.

En esta sección, crearemos un guardia que interactúa con el proveedor de autenticación que se acaba de crear en la última sección.

Ahora vamos a crear un archivo en app/Services/Auth/JsonGuard.php con los siguientes contenidos.

En primer lugar, nuestra clase necesita implementar la interfaz Illuminate\Contracts\Auth\Guard. Por lo tanto, necesitamos definir todos los métodos declarados en esa interfaz.

Lo importante a tener en cuenta aquí es que la función __construct requiere una implementación de Illuminate\Contracts\Auth\UserProvider. En nuestro caso, pasaremos una instancia de App\Extensions\MongoUserProvider, como veremos en la sección posterior.

A continuación, hay una función getJsonParams que recupera las credenciales del usuario del parámetro de solicitud llamado jsondata. Como se espera que recibamos una cadena codificada JSON de las credenciales del usuario, hemos utilizado la función json_decode para decodificar los datos JSON.

En la función de validación, lo primero que verificamos es la existencia del argumento $credentials. Si no está presente, llamaremos al método getJsonParams para recuperar las credenciales del usuario de los parámetros de solicitud.

Ahora, vamos a llamar al método retrieveByCredentials del proveedor MongoUserProvider que recupera al usuario de la base de datos de MongoDB. Finalmente, es el método validateCredentials del proveedor MongoUserProvider el que verifica la validez del usuario.

Aquí termina la implementación de nuestra guardia personalizada. La siguiente sección describe cómo unir estas piezas para formar un sistema de autenticación exitoso.

Juntando todo

Hasta ahora, hemos desarrollado todos los elementos del protector de autenticación personalizado. Este debería proporcionarnos un nuevo sistema de autenticación. Sin embargo, no funcionará fuera de la caja ya que en primer lugar, necesitamos registrarlo utilizando los enlaces de contenedor de servicio Laravel.

Como ya debes saber, el proveedor de servicios Laravel es el lugar adecuado para implementar los enlaces necesarios.

Continúa y abre el archivo app/Providers/AuthServiceProvider.php el cual nos permite agregar enlaces de contenedor de servicio de autenticación. Si no contiene ningún cambio personalizado, puedes reemplazarlo con los siguientes contenidos.

Veamos el método de arranque boot que contiene la mayoría de los enlaces de proveedor.

Para empezar, crearemos enlaces para los elementos App\Database\MongoDatabase y App\Models\Auth\User.

Ha pasado un tiempo en el cual hemos estado hablando de proveedores y guardias, y es hora de conectar nuestro guardia personalizado en el sistema de autenticación Laravel.

Hemos utilizado el método de proveedor de Auth Facade para agregar nuestro proveedor de autenticación personalizado bajo la clave mongo. Recuerda que la clave refleja la configuración que se agregó anteriormente en el archivo auth.php.

De manera similar, inyectaremos nuestra implementación de guardia personalizada utilizando el método extendido de la Auth facade.

A continuación, hay un método de registro llamado register que hemos utilizado para vincular App\Services\Contracts\NosqlServiceInterface con la implementación de App\Database\MongoDatabase.

Por lo tanto, siempre que sea necesario resolver la dependencia App\Services\Contracts\NosqlServiceInterface, Laravel responde con la implementación del adaptador App\Database\MongoDatabase.

El beneficio de usar esta propuesta es que uno puede cambiar fácilmente la implementación dada con una implementación personalizada. Por ejemplo, digamos que a alguien le gustaría reemplazar la implementación App\Database\MongoDatabase con el adaptador CouchDB en el futuro. En ese caso, solo necesitaría agregar el enlace correspondiente en el método de registro.

Por lo tanto, ese era el proveedor de servicios a tu disposición. En este momento, tenemos todo lo que se requiere para probar nuestra implementación de guardia personalizada, por lo que la siguiente y última sección se trata de eso.

¿Funciona?

Has hecho todo el trabajo de configuración de tu primer protector de autenticación personalizado, y ahora es el momento de cosechar los beneficios, ya que vamos a continuar y lo probaremos.

Implementemos rápidamente un controlador bastante básico app/Http/Controllers/MongoController.php como se muestra a continuación.

Observa de cerca la dependencia del método de inicio de sesión, que requiere la implementación de la protección Illuminate\Contracts\Auth\Guard. Como hemos configurado el protector personalizado como el protector predeterminado en el archivo auth.php, es App\Services\Auth\JsonGuard que se inyectará en realidad.

A continuación, llamamos al método de validación llamado validate de la clase App\Services\Auth\JsonGuard, que a su vez inicia una serie de llamadas a métodos:

  • Llama al método retrieveByCredentials de la clase App\Extensions\MongoUserProvider.
  • El método retrieveByCredentials llama al método fetchUserByCredentials de la clase User App\Models\Auth\User.
  • El método fetchUserByCredentials llama al método de búsqueda find de App\Database\MongoDatabase para recuperar las credenciales del usuario.
  • Finalmente, el método find de App\Database\MongoDatabase devuelve la respuesta.

Si todo funciona como se espera, deberíamos obtener un usuario autenticado llamando al método user de nuestra guardia.

Para acceder al controlador, debes agregar una ruta asociada en el archivo routes/web.php.

Intenta acceder a la URL http://tu-sitio-laravel/custom/mongo/login sin pasar ningún parámetro y deberías ver un mensaje de "no autorizado".

Por otro lado, prueba algo como http://tu-sitio-laravel/custom/mongo/login?jsondata={"username":"admin","password":"admin"} y eso debería devolver un mensaje de éxito si el usuario está presente en tu base de datos.

Ten en cuenta que esto es solo para fines de ejemplo, para demostrar cómo funciona el protector personalizado. Deberías implementar una solución infalible para una característica como el inicio de sesión. De hecho, acabo de proporcionar una idea del flujo de autenticación; eres responsable de construir una solución robusta y segura para tu aplicación.

Aquí finaliza nuestro viaje de hoy, y con suerte volveré con más cosas útiles. Si quieres que escriba sobre algún tema específico, ¡no olvides dejarme una línea!

Conclusión

El framework de Laravel proporciona un sistema de autenticación sólido en el núcleo que podría ampliarse si deseas implementar uno personalizado. Ese fue el tema del artículo de hoy para implementar un guardia personalizado y conectarlo al flujo de trabajo de autenticación de Laravel.

En el transcurso de eso, continuamos y desarrollamos un sistema que autentica al usuario basado en la carga JSON en la solicitud y lo combina con la base de datos MongoDB. Y para lograr eso, terminamos creando un protector personalizado y una implementación de proveedor personalizado.

Espero que el ejercicio te haya proporcionado una idea del flujo de autenticación de Laravel, y ahora deberías sentirte más seguro acerca de su funcionamiento interno.

Para aquellos de ustedes que recién están comenzando con Laravel o buscando ampliar el conocimiento, sitio o aplicación con extensiones, tenemos una variedad de cosas que pueden estudiar en Envato Market.

Me encantaría escuchar tus comentarios y sugerencias, ¡así que grita en voz alta usando el feed a continuación!.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.