Hoy vamos con la segunda parte de roles y permisos en Laravel. Lo que vamos a hacer es aplicar las restricciones según si el usuario logueado tiene el permiso o el rol necesario para hacer una acción determinada. Cambiaremos los Form Request, también algunas condiciones que hay en la vista de la lista de posts y también modificaremos la policy de los posts.
Primero de todo, vamos a la vista de la lista de posts ( posts.blade.php ) y modificamos el if que restringe el acceso al formulario de creación de posts y también modificamos el if que permite ver los botones de editar y eliminar los posts de la lista:
1 2 3 4 5 6 7 |
@if (Auth::check() && Auth::user()->hasPermissionTo('post_create')) ... @endif ... @if (Auth::check() && ($post->user_id == Auth::id() || Auth::user()->hasRole('administrator'))) ... @endif |
Como en mi caso, no quiero que cualquier usuario pueda acceder a crear un post simplemente los que tengan el permiso, restrinjo el acceso comprobando si el usuario logueado tiene el permiso post_create. Actualmente, serían todos los administradores, pero se puede crear otro rol (por ejemplo, escritores) y que tenga ese permiso y no otros que tendrían los administradores, es decir, un rol intermedio entre los administradores y los usuarios.
También quiero que los administradores puedan editar o eliminar un post, por tanto, lo pongo en la comprobación. Si el usuario logueado tiene asignado el rol de administrator, también podrá eliminar y editar cualquier post, no hará falta que sea el creador.
Ahora vamos a modificar la función authorize del Form Request PostRequest.php . Este archivo comprueba que tengas la autorización para poder crear o editar un post y también valida que los datos enviados sean correctos.
1 2 3 4 |
public function authorize() { return \Auth::check() && (\Auth::user()->hasPermissionTo('post_create') || \Auth::user()->hasPermissionTo('post_edit')); } |
Simplemente, se comprueba que usuario logueado tenga el permiso post_create o post_edit.
Vamos a modificar la policy de los posts (PostPolicy.php):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php namespace App\Policies; use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Support\Facades\Auth; use App\User; use App\Post; class PostPolicy { use HandlesAuthorization; public function create(User $user) { return User::findOrFail($user->id)->hasPermissionTo('post_create'); } public function update(User $user, Post $post) { return $user->id === $post->user_id || User::findOrFail($user->id)->hasPermissionTo('post_edit'); } public function delete(User $user, Post $post) { return $user->id === $post->user_id || User::findOrFail($user->id)->hasPermissionTo('post_delete'); } } |
Hemos creado un nuevo método create para comprobar que los usuarios tenga el permiso necesario a la hora de crear un post, como hemos hecho anteriormente con el formulario en la vista. También, se tiene que añadir la comprobación al método update y delete, esto es para que lo usuarios que no son los creadores del post pero que tienen los permisos pueden editar y eliminar el post.
Finalemente, para aplicar el nuevo método create tenemos que añadir esta línea, tal como hicimos en los otros métodos del controlador anteriormente:
1 |
$this->authorize('create', Post::class); |
Solo tengo una duda, hice todos los pasos y no tengo ningun error pero ahora no me sale el formulario para crear los posts con ningun usuario, ya no puedo escribir publicaciones.
Hola,
Eso es porque para comentar necesitas un usuario administrador y que tenga los permisos. Fíjate en la base de datos si tienes alguno.
Si has seguido los pasos deberías tener. En este post se crean http://fullstackseries.com/laravel-5-4-19-roles-permisos-parte-1/
Un saludo!