From 6c15b3a822c88c543bede908b5f9da0c8a2ca05a Mon Sep 17 00:00:00 2001 From: Fawzi Noual Date: Wed, 25 Nov 2020 11:31:40 +0100 Subject: [PATCH] Ajout Config et migrations --- composer.json | 25 ++++++++ src/Console/InstallRolesPackage.php | 42 +++++++++++++ src/Models/Role.php | 18 ++++++ src/Traits/HasRoles.php | 59 +++++++++++++++++++ src/UseRoleServiceProvider.php | 42 +++++++++++++ src/config/roles.php | 12 ++++ .../create_role_user_table.php.stub | 33 +++++++++++ .../migrations/create_roles_table.php.stub | 34 +++++++++++ .../seeders/RolesTableSeeder.php.stub | 26 ++++++++ 9 files changed, 291 insertions(+) create mode 100644 composer.json create mode 100644 src/Console/InstallRolesPackage.php create mode 100644 src/Models/Role.php create mode 100644 src/Traits/HasRoles.php create mode 100644 src/UseRoleServiceProvider.php create mode 100644 src/config/roles.php create mode 100644 src/database/migrations/create_role_user_table.php.stub create mode 100644 src/database/migrations/create_roles_table.php.stub create mode 100644 src/database/seeders/RolesTableSeeder.php.stub diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..83efe81 --- /dev/null +++ b/composer.json @@ -0,0 +1,25 @@ +{ + "name": "fnoual/roles", + "description": "Laravel roles system", + "type": "project", + "license": "MIT", + "authors": [ + { + "name": "Fawzi Noual", + "email": "fouzi.noual@gmail.com" + } + ], + "require": {}, + "autoload": { + "psr-4": { + "Fnoual\\Roles\\" : "src/" + } + }, + "extra": { + "laravel": { + "providers": [ + "Fnoual\\Roles\\UseRoleServiceProvider" + ] + } + } +} diff --git a/src/Console/InstallRolesPackage.php b/src/Console/InstallRolesPackage.php new file mode 100644 index 0000000..333b6de --- /dev/null +++ b/src/Console/InstallRolesPackage.php @@ -0,0 +1,42 @@ +info('Installation ...'); + + $this->call('vendor:publish', [ + '--provider' => "Fnoual\Roles\UseRoleServiceProvider" + ]); + + $this->call('migrate:fresh'); + + $this->info('Table créée avec succès.'); + + DB::table('roles')->insert([ + 'id' => 1, + 'name' => 'admin', + 'description' => 'Administrateur Système', + ]); + + DB::table('roles')->insert([ + 'id' => 2, + 'name' => 'user', + 'description' => 'Utilisateur', + ]); + + $this->info('Rôles admin et utilisateurs créés 👍'); + + $this->info('Package installé 🚀'); + } +} diff --git a/src/Models/Role.php b/src/Models/Role.php new file mode 100644 index 0000000..e6f7930 --- /dev/null +++ b/src/Models/Role.php @@ -0,0 +1,18 @@ +belongsToMany(User::class); + } +} diff --git a/src/Traits/HasRoles.php b/src/Traits/HasRoles.php new file mode 100644 index 0000000..ad5d352 --- /dev/null +++ b/src/Traits/HasRoles.php @@ -0,0 +1,59 @@ +belongsToMany(Role::class, 'role_user', 'user_id', 'role_id'); + } + + /** + * @param string|array $roles + * @return bool + */ + public function authorizeRoles($roles) + { + if (is_array($roles)) { + return $this->hasAnyRole($roles) || + abort(401, 'Cette action n\'est pas autorisée.'); + } + return $this->hasRole($roles) || + abort(401, 'Cette action n\'est pas autorisée.'); + } + + /** + * Vérifier plusieurs rôles + * @param array $roles + * @return bool + */ + public function hasAnyRole($roles) + { + return null !== $this->roles()->whereIn('name', $roles)->first(); + } + + /** + * Vérifier un rôle + * @param string $role + * @return bool + */ + public function hasRole($role) + { + return null !== $this->roles()->where('name', $role)->first(); + } + + public function isAdmin() + { + return $this->roles->first()->id === config('roles.super_user_role_id'); + } + + public static function boot() + { + self::created(function ($model) { + $model->roles()->attach(Role::find(config('roles.user_role_id'))); + }); + } +} diff --git a/src/UseRoleServiceProvider.php b/src/UseRoleServiceProvider.php new file mode 100644 index 0000000..33853e5 --- /dev/null +++ b/src/UseRoleServiceProvider.php @@ -0,0 +1,42 @@ +mergeConfigFrom(__DIR__.'/config/roles.php', 'roles'); + } + + public function boot() + { + if ($this->app->runningInConsole()) { + $this->commands([ + InstallRolesPackage::class, + ]); + if (! class_exists('CreateRolesTable')) { + $this->publishes([ + __DIR__ . '/database/migrations/create_roles_table.php.stub' => database_path('migrations/' . date('Y_m_d_His', time()) . '_create_roles_table.php'), + ], 'migrations'); + } + if (! class_exists('CreateRolesTable')) { + $this->publishes([ + __DIR__ . '/database/migrations/create_role_user_table.php.stub' => database_path('migrations/' . date('Y_m_d_His', time()) . '_create_role_user_table.php'), + ], 'migrations'); + } + if (! class_exists('RolesTableSeeder')) { + $this->publishes([ + __DIR__ . '/database/seeders/RolesTableSeeder.php.stub' => database_path('seeds/RolesTableSeeder.php'), + ], 'seeds'); + } + $this->publishes([ + __DIR__.'/config/roles.php' => config_path('roles.php'), + ], 'config'); + } + + } +} diff --git a/src/config/roles.php b/src/config/roles.php new file mode 100644 index 0000000..8a1bc11 --- /dev/null +++ b/src/config/roles.php @@ -0,0 +1,12 @@ + 1, + /* + * ID par défaut du rôle utilisateur + */ + 'user_role_id' => 2, +]; diff --git a/src/database/migrations/create_role_user_table.php.stub b/src/database/migrations/create_role_user_table.php.stub new file mode 100644 index 0000000..5dbdf8c --- /dev/null +++ b/src/database/migrations/create_role_user_table.php.stub @@ -0,0 +1,33 @@ +id(); + $table->unsignedBigInteger('role_id'); + $table->unsignedBigInteger('user_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('roles'); + } +} diff --git a/src/database/migrations/create_roles_table.php.stub b/src/database/migrations/create_roles_table.php.stub new file mode 100644 index 0000000..f2fd86c --- /dev/null +++ b/src/database/migrations/create_roles_table.php.stub @@ -0,0 +1,34 @@ +id(); + $table->string('name'); + $table->string('icon')->default('user'); + $table->string('description'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('roles'); + } +} diff --git a/src/database/seeders/RolesTableSeeder.php.stub b/src/database/seeders/RolesTableSeeder.php.stub new file mode 100644 index 0000000..575f052 --- /dev/null +++ b/src/database/seeders/RolesTableSeeder.php.stub @@ -0,0 +1,26 @@ + 1, + 'name' => 'admin', + 'description' => 'Administrateur système' + ]); + Role::create([ + 'id' => 2, + 'name' => 'user', + 'description' => 'Utilisateur' + ]); + } +}