laravel 5.6 Politicas de acceso Policies

vamos a hacer uso de las clases policy de laravel para programar accesos
hacia algunas funcionalidades del sitio

entonces la idea final es que un usuario pueda editar/actualizar sus propios datos
y tambien que un usuario con rol admin pueda hacerlo para cualquiera.

1) crear la clase UserPolicy

php artisan make:policy UserPolicy

este comando creara la clase app/policies/UserPolicy.php

2) registrar la relacion del modelo User con la clase UserPolicy

ir a app/Providers/AuthServiceProvider.php

protected $policies = [
        'App\User' => 'App\Policies\UserPolicy',
    ];

3) en UserPolicy.php crear la function before, que se llamara antes de cualquier otra declarada en la clase. Aqui se evaluara si el usuario logueado es admin y si es verdadero devuelve true, salteando la evaluacion de las otras funciones. De lo contrario, llama a la function correspondiente para que haga la evaluacion de si el usuario logueado es el mismo que se quiere editar/actualizar.



 public function before($user,$ability){
        if($user->hasRoles(['admin'])){
            return true;
        }
    }

    public function edit(User $authUser, User $user){
        return ($authUser->id == $user->id);
    }
    public function update(User $authUser, User $user){
        return ($authUser->id == $user->id);
    }
    public function destroy(User $authUser, User $user){
        return ($authUser->id == $user->id);
    }


4)en UserController exceptuar la validacion para los casos de edit y update

public function __construct(){
       //$this->middleware(['auth','checkRoles:admin,moderador']);
        $this->middleware('auth');
        $this->middleware('checkRoles:admin,moderador',['except'=>['edit','update']]);
    }

5)en UserController llamar desde las functiones de edit y update
a la function authorize para que dispare las validaciones del UserPolicy

public function edit($id)
    {
        $user = User::findOrFail($id);

        $this->authorize($user);

        return view('users.edit',compact('user'));
    }

    public function update(UpdateUserRequest $request, $id)
    {
        $user = User::findOrFail($id);

        $this->authorize($user);
       

        $user->update($request->all())  ;
        return redirect()->route('users.index');

    }



No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable