laravel 安装并使用多角色管理
Composer 安装:
$ composer require "spatie/laravel-permission:~2.7"
生成数据库迁移文件:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
数据表各自的作用:
- roles —— 角色的模型表;
- permissions —— 权限的模型表;
- model_has_roles —— 模型与角色的关联表,用户拥有什么角色在此表中定义,一个用户能拥有多个角色;
- role_has_permissions —— 角色拥有的权限关联表,如管理员拥有查看后台的权限都是在此表定义,一个角色能拥有多个权限;
- model_has_permissions —— 模型与权限关联表,一个模型能拥有多个权限。
介绍完数据表后,接下来继续使用以下命令应用数据迁移:
$ php artisan migrate
生成配置信息:
$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
加载 HasRoles
app/Models/User.php
<?php
.
.
.
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
use HasRoles;
.
.
.
}
初始化角色和权限
$ php artisan make:migration seed_roles_and_permissions_data
打开迁移文件,书写初始化权限和角色的代码:
database/migrations/{timestamp}_seed_roles_and_permissions_data.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Eloquent\Model;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
class SeedRolesAndPermissionsData extends Migration
{
public function up()
{
// 清除缓存
app()['cache']->forget('spatie.permission.cache');
// 先创建权限
Permission::create(['name' => 'manage_contents']);
Permission::create(['name' => 'manage_users']);
Permission::create(['name' => 'edit_settings']);
// 创建站长角色,并赋予权限
$founder = Role::create(['name' => 'Founder']);
$founder->givePermissionTo('manage_contents');
$founder->givePermissionTo('manage_users');
$founder->givePermissionTo('edit_settings');
// 创建管理员角色,并赋予权限
$maintainer = Role::create(['name' => 'Maintainer']);
$maintainer->givePermissionTo('manage_contents');
}
public function down()
{
// 清除缓存
app()['cache']->forget('spatie.permission.cache');
// 清空所有数据表数据
$tableNames = config('permission.table_names');
Model::unguard();
DB::table($tableNames['role_has_permissions'])->delete();
DB::table($tableNames['model_has_roles'])->delete();
DB::table($tableNames['model_has_permissions'])->delete();
DB::table($tableNames['roles'])->delete();
DB::table($tableNames['permissions'])->delete();
Model::reguard();
}
}
为了测试的方便,我们需要在生成用户填充数据以后,为 1 号和 2 号用户分别指派角色,修改 run() 方法 :
database/seeds/UsersTableSeeder.php
<?php
use Illuminate\Database\Seeder;
use App\Models\User;
//php artisan make:seeder UsersTableSeeder
class UsersTableSeeder extends Seeder
{
public function run()
{
// 获取 Faker 实例
$faker = app(Faker\Generator::class);
// 生成数据集合
$users = factory(User::class)
->times(10)
->make();
// 让隐藏字段可见,并将数据集合转换为数组
$user_array = $users->makeVisible(['password', 'remember_token'])->toArray();
// 插入到数据库中
User::insert($user_array);
// 单独处理第一个用户的数据
$user = User::find(1);
$user->name = 'yiluohan1234';
$user->email = '1097189275@qq.com';
//$user->avatar = 'https://fsdhubcdn.phphub.org/uploads/images/201710/14/1/ZqM7iaP4CR.png?imageView2/1/w/200/h/200';
$user->save();
// 初始化用户角色,将 1 号为『管理员』
$user->assignRole('administor');
}
}
在blade模板和路由中使用方法
在blade模板中
@can('manager_user')
.
.
.
@endcan
在路由中
.
.
.
middleware =>[...,'can:manager_user'],
.
.
.
详细说明,请参照官网