laravel 权限管理包


1. 安装扩展包

$ composer require "spatie/laravel-permission:~2.29"

生成数据库迁移文件:

$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

下图是 laravel-permission 的数据库表结构:

执行迁移文件:

$ php artisan migrate

生成配置文件:

$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

2. 加载 HasRoles

我们还需在 User 中使用 laravel-permission 提供的 Trait —— HasRoles,此举能让我们获取到扩展包提供的所有权限和角色的操作方法。

app/Models/User.php

namespace App\Models;

use Spatie\Permission\Traits\HasRoles;              #权限管理工具
.
.
.

class User extends Authenticatable
{
    use HasRoles;
.
.
.

3初始化角色权限

创建数据填充文件,填充一下默认权限的和角色

$ php artisan make:migration seed_roles_and_permissions_data

打开迁移文件,书写初始化权限和角色的代码:

database/migrations/{timestamp}_seed_roles_and_permissions_data.php

<?php

use Illuminate\Database\Eloquent\Model;             #laravel的模型管理类
use Spatie\Permission\Models\Role;                  #引入的角色模型
use Spatie\Permission\Models\Permission;            #引入的权限模型

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

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();
    }
}

发布默认角色和权限:

$ php artisan migrate:refresh --seed
$ php artisan migrate                            #或者是这个

指定角色为站长:

$ php artisan tinker
>>>  $user = App\Models\User::find(101);
>>>  $user->assignRole('Founder');

指定角色为维护者:

>>>  $user2 = App\Models\User::find(102);
>>>  $user2->assignRole('Maintainer');

4权限部署

app/Policies/Policy.php

<?php

namespace App\Policies;

use Illuminate\Auth\Access\HandlesAuthorization;

class Policy
{
    use HandlesAuthorization;

    /**
     * 在所有策略之前
     * @param $user
     * @param $ability
     * @return bool
     */
    public function before($user, $ability)
    {
        #如果用户拥有管理内容的权限的话,即授权通过
        if ($user->can('manage_contents')) {
            return true;
        }
    }
}

Horizon 访问权限:

Horizon 控制面板页面的路由是 /horizon ,默认只能在 local 环境中访问仪表盘。我们可以使用 Horizon::auth 方法定义更具体的访问策略。auth 方法能够接受一个回调函数,此回调函数需要返回 true 或 false ,从而确认当前用户是否有权限访问 Horizon 仪表盘。接下来我们定义 /horizon 的访问权限,只有 站长 才有权限查看:

app/Providers/HorizonServiceProvider.php

.
.
.
public function boot()
{
    .
    .
    .
    Horizon::auth(function ($request) {
        return \Auth::user()->hasRole('Founder');
    });
}
.
.
.

注册地平线服务

config/app.php

.
.
.
'providers' => [
    .
    .
    .
    App\Providers\HorizonServiceProvider::class, #Horizon 地平线服务
    .
    .
    .

5. laravel-permission简单用法

 

新建角色:

use Spatie\Permission\Models\Role;

$role = Role::create(['name' => 'Founder']);

 

为角色添加权限

use Spatie\Permission\Models\Permission;

Permission::create(['name' => 'manage_contents']);
$role->givePermissionTo('manage_contents');

赋予用户某个角色

// 单个角色
$user->assignRole('Founder');

// 多个角色
$user->assignRole('writer', 'admin');

// 数组形式的多个角色
$user->assignRole(['writer', 'admin']);

检查用户角色:

// 是否是站长
$user->hasRole('Founder');

// 是否拥有至少一个角色
$user->hasAnyRole(Role::all());

// 是否拥有所有角色
$user->hasAllRoles(Role::all());

检查用户权限:

// 检查用户是否有某个权限
$user->can('manage_contents');

// 检查角色是否拥有某个权限
$role->hasPermissionTo('manage_contents');
直接给用户添加权限:

// 为用户添加『直接权限』
$user->givePermissionTo('manage_contents');

// 获取所有直接权限
$user->getDirectPermissions()
来源: 原创
标签: 权限管理 laravel

作者介绍

Image Description

zfajax舫

小时候的梦想是当宇航员,长大的梦想是在北京买套90㎡房的小站长、自媒体人,2014年毕业,后从事过网站开发搭建工作;2016年,创建了张舫博客;20015-至今在北京工作(微信:a7983310)

评论列表

还没有人评论,抢占前排沙发

发表评论

关于作者

Image Description

zfajax舫

小时候的梦想是当宇航员,长大的梦想是在北京买套90㎡房的小站长、自媒体人,2014年毕业,后从事过网站开发搭建工作;2016年,创建了张舫博客;20015-至今在北京工作(微信:a7983310)

关注作者

Social Links

定制项目外包

Unit 25 Suite 3, 925 Prospect PI,
Beach Resort, 23001

手机号码

18600004319