Como he comentado en varios posts, iba a escribir sobre cómo añadir un sistema de roles en nuestro proyecto, el primer post escribiré sobre ésto, será éste. No sé cuantas partes tendrá, pero tendrá varias.
Hoy añadiremos el paquete necesario para poder gestionar los roles y permisos de nuestro proyecto con Laravel.
Instalación paquete
Instalaremos el paquete laravel-permission de Spatie. Esta guía de instalación está basada en la documentación del paquete.
Primero lo descargamos:
1 |
composer require spatie/laravel-permission |
Cuando finalice, tenemos que añadir al array providers de config/app.php esta línea:
1 2 3 4 |
'providers' => [ ... Spatie\Permission\PermissionServiceProvider::class, ]; |
Publicamos la migración necesaria y la ejecutamos:
1 2 3 |
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations" php artisan migrate |
Publicamos el archivo de configuración:
1 |
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config" |
Y ya estaría instalado, simplemente nos falta añadir estas líneas al modelo User.php para poder empezar a utilizarlo:
1 2 3 4 5 6 7 |
... use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { use HasRoles; ... |
Modificación de los seeders
Actualmente en nuestros seeders no se consideran los roles y permisos, por eso vamos a hacer que se creen unos roles y permisos y asignarlos a los usuarios que se generan.
Vamos a crear los seeders para los roles y permisos:
1 2 |
php artisan make:seeder PermissionsTableSeedeer php artisan make:seeder RolesTableSeedeer |
Abrimos el PermissionsTableSeeder.php y añadimos este código, esto simplemente es un ejemplo, podemos añadir los permisos que queramos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php use Illuminate\Database\Seeder; use Spatie\Permission\Models\Permission; class PermissionsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { Permission::create(['name' => 'post_create']); Permission::create(['name' => 'post_edit']); Permission::create(['name' => 'post_delete']); Permission::create(['name' => 'comment_create']); } } |
Abrimos el RolesTableSeeder.php y añadimos este código, esto simplemente es un ejemplo, podemos añadir los roles que queramos y asignarle los permisos que queramos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php use Illuminate\Database\Seeder; use Spatie\Permission\Models\Role; class RolesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $role = Role::create(['name' => 'administrator']); $role->givePermissionTo('post_create','post_edit', 'post_delete', 'comment_create'); $role = Role::create(['name' => 'user']); $role->givePermissionTo('comment_create'); } } |
Y modificamos el seeder de los usuarios:
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 |
<?php use Illuminate\Database\Seeder; use App\User; use App\Post; class UsersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { factory(User::class, 5)->create()->each(function($u) { if ($u->id == 1) { $u->assignRole('administrator'); } else { $u->assignRole('user'); } }); factory(Post::class, 8)->create(['user_id'=>1]); } } |
Estamos generando 5 usuarios. Al primer usuario generado le asignamos el rol de administrator y a los demás el rol user. Después, generamos 8 posts que van asociados al usuario con el id número 1 (el administrador).
Modificamos el DatabaseSeeder.php :
1 2 3 |
$this->call(PermissionsTableSeeder::class); $this->call(RolesTableSeeder::class); $this->call(UsersTableSeeder::class); |
Refrescamos la base de datos (eliminamos todo el contenido) y ejecutamos los seeders con este comando:
1 |
php artisan migrate:refresh --seed |
Ahora vamos a asignar a los nuevos usuarios que se registren el rol user. Abrimos el RegisterController.php y modificamos el método create:
1 2 3 4 5 6 7 8 9 10 11 12 |
protected function create(array $data) { $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'country' => $data['country'], 'password' => bcrypt($data['password']), ]); $user->assignRole('user'); return $user; } |
Hola tuve un problema con el Seeder «UsersTableSeeder» al poner en consola: php artisan migrate:refresh –seed me manda el siguiente mensaje: Call to undefined method Illuminate\Database\Query\Builder::assignRole().
Para solucionarlo agregue al seeder: use App\Repositories\User\EloquentUserRepository;
y corrió perfecto.
Saludos