En la actualidad, el manejo y la seguridad en el acceso a la información son esenciales, especialmente cuando trabajamos con aplicaciones que manejan datos sensibles o personales. Imagina tener una aplicación de recetas donde cada usuario podría borrar o actualizar cualquier receta, sin importar si la ha creado o no. Aquí radica la importancia de definir políticas de acceso precisas: garantizar que los usuarios solo puedan interactuar con el contenido que les pertenece.
¿Qué es una política de acceso y por qué es importante?
La política de acceso es un conjunto de reglas que definen las capacidades de un usuario dentro de una aplicación. Su importancia radica en la necesidad de controlar las acciones que cada usuario puede realizar, proporcionando así un sistema más seguro y organizado. Veamos cómo abordar la implementación de políticas de acceso con un ejemplo claro y directo.
¿Cómo iniciar la creación de políticas de acceso?
Empezamos con la creación de un nuevo archivo de políticas utilizando la consola de comandos. Los pasos son simples:
Al seguir esta nomenclatura, Laravel podrá automatizar y descubrir los archivos de políticas sin requerir registro adicional.
¿Cómo se estructura una política de acceso en el código?
Una vez creado el archivo de política, nos enfocamos en definir las reglas específicas que queremos aplicar. Ejemplo de esto es un método que verifica si una receta pertenece al usuario que intenta realizar una acción sobre ella:
Si el identificador de usuario coincide con el identificador del creador de la receta, se retorna verdadero, permitiendo la acción. Esto permite separar la lógica de negocios del controlador, manteniendo así el código limpio y organizado.
¿Cómo integrar las políticas de acceso con los controladores?
La integración de las políticas con los controladores es vital para aplicar las reglas de autorización. Aquí es donde vinculamos la política con la acción correspondiente en el controlador:
Cada línea encima está haciendo una llamada al sistema de autorización de Laravel, verificando si el usuario autenticado está autorizado para actualizar o eliminar la receta especificada.
¿Cómo verificar si las políticas de acceso funcionan correctamente?
Para probar nuestras políticas, podemos usar Postman realizando peticiones de eliminación y actualización:
Enviar una petición DELETE a una receta que pertenezca al usuario autenticado.
Intentar borrar una receta que no pertenezca al usuario, lo que debería resultar en un mensaje de no autorizado.
¿Es necesario registrar manualmente las políticas de acceso?
Gracias a las convenciones de Laravel, si seguimos el estándar de nomenclatura (NombreEntidadPolicy), no es necesario registrar manualmente la política. Laravel automáticamente detectará y aplicará las políticas de acceso.
La implementación efectiva de políticas de acceso no solo protege la información, sino que también mejora la organización y mantenimiento del código. En la práctica, estos procesos se vuelven esenciales para el desarrollo seguro de aplicaciones. Recuerda, el aprendizaje y la mejora continua son claves en la programación; cada clase es un paso adelante en el dominio de estas importantes habilidades. ¡Sigue adelante y aplica estos conocimientos en tu próximo proyecto!
Ah! aqui solucionan el problema de que cualquier usuario puede editar cualquier receta, gracias profe...
exacto
$user->id === $recipe->user_id
Excelenteeee, superrr, Pero como seria que tanto el autor quien creo la receta o el admin pueda eliminar el dato... Seria super super un video donde incluyan roles: admin, usuario, cajeros
En Laravel hay librerías como Spatie para administrar roles y permisos:
Clarísima la explicación del profesor sobre las policies: Aislamos el IF, la receta es tuya sí o no, directo al punto.
Comparto tambien otra logica de validacion:
return $recipe->user()->is($user);
tambien nos regresara true or false
Con Laravel 11 tuve que poner (dentro del controller)
use Illuminate\Support\Facades\Gate;
Gate::authorize('update', $recipe);
Gate::authorize('delete', $recipe);
Gracias, también estoy en Laravel 11 e intenté muchas cosas, pero solo me funcionó tu solución. Muchas gracias!
Tuve que agregar
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
y el trait
use AuthorizesRequests;
No sé porque el profesor no tuvo que hacerlo
Estarás utilizando Laravel 11.x
// Laravel 10.xnamespaceApp\Http\Controllers;useIlluminate\Foundation\Auth\AuthorizeRequests;useIlluminate\Foundation\Auth\ValidatesRequest;useIlluminate\Routing\Controlleras BaseController;class<u>Controller</u>extends<u>BaseController</u>{  use AuthorizeRequests, ValidatesRequest;}
En Laravel 11.x, esto se hace en cada controlador específico que necesite de una autorización.
Por ejemplo:
// RecipeController.php...useIlluminate\Foundation\Auth\AuthorizeRequests;class<u>RecipeController</u>extends<u>Controller</u>{  use AuthorizesRequests;  ....}
Estarás utilizando Laravel 11.x
// Laravel 10.xnamespaceApp\Http\Controllers;useIlluminate\Foundation\Auth\AuthorizeRequests;useIlluminate\Foundation\Auth\ValidatesRequest;useIlluminate\Routing\Controlleras BaseController;classControllerextendsBaseController{  use AuthorizeRequests, ValidatesRequest;}
En Laravel 11.x, esto se hace en cada controlador específico que necesite de una autorización.
Por ejemplo:
// RecipeController.php...useIlluminate\Foundation\Auth\AuthorizeRequests;classRecipeControllerextendsController{  use AuthorizesRequests;  ...}