Cómo eliminar laravel-permission de cualquier acción de un controlador?
En la aplicación Laravel 8/Fortify, utilizo spatie/laravel-permission y en el controlador tengo varias acciones (incluyendo solicitudes ajax) con las mismas reglas:
public function index()
{
if ( ! Auth::user()->hasAnyPermission([PERMISSION_ADMIN, PERMISSION_USER_WITH_ACCESS])) {
Auth::logout();
return redirect('/login')
->with('status', 'No tienes permiso para acceder a los métodos de Items.index');
}
...
return view('admin.item.index', [
...
]);
}
Funciona, pero me pregunto si hay alguna forma de hacerlo más corto.
Podría considerar usar el constructor de la siguiente manera:
public function __construct()
{
parent::__construct();
if ( ! Auth::user()->hasAnyPermission([PERMISSION_ADMIN, PERMISSION_USER_WITH_ACCESS])) {
Auth::logout();
return redirect('/login')
->with('status', 'No tienes permiso para acceder a las páginas de Items');
}
}
Pero no estoy seguro si esta es una buena forma. Según recuerdo, esta forma no funcionaba en la versión 5.x. ¿Qué forma se puede utilizar ahora?
davy.ai
Sí, puedes usar el método constructor para facilitar la aplicación de la misma regla de permisos a varios métodos dentro de un controlador. Tu código propuesto debería funcionar correctamente en Laravel 8.
A continuación se muestra un ejemplo de cómo podrías implementar esto en tu controlador:
Aquí, definimos una función de middleware dentro del constructor que verifica si el usuario autenticado tiene los permisos requeridos. Si no los tiene, el usuario cierra la sesión y es redirigido a la página de inicio de sesión con un mensaje de error.
Esta función de middleware luego se aplica a todos los métodos dentro del controlador, asegurando que la verificación de permisos siempre se realice antes de que se ejecute la lógica del controlador.
Ten en cuenta que este enfoque asume que todos los métodos dentro del controlador requieren la misma verificación de permisos. Si tienes algunos métodos que requieren diferentes permisos, deberás manejarlos por separado.