laravel 权限管理包
- 作者 : zfajax舫
- |
- 发布时间 : 6年前
- |
- 评论数 : 0
- 查看数 : 78
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()