es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    use Illuminate\Support\Facades\Auth;
    
    class ItemController extends Controller
    {
        public function __construct()
        {
            $this->middleware(function ($request, $next) {
                if (!Auth::user()->hasAnyPermission([PERMISSION_ADMIN, PERMISSION_USER_WITH_ACCESS])) {
                    Auth::logout();
                    return redirect('/login')
                        ->with('status', 'No tienes permiso para acceder a esta página');
                }
                return $next($request);
            });
        }
    
        public function index()
        {
            // ...
        }
    
        public function create()
        {
            // ...
        }
    
        // ...
    }
    

    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.

Comments are closed.