laravle 安装并使用多角色管理

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 = '[email protected]';
        //$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'],
.
.
.

详细说明,请参照官网

猜你喜欢

转载自blog.csdn.net/yiluohan0307/article/details/80514420