laravel 权限管理
2019年4月12日1. 安装扩展包
1 |
$ composer require "spatie/laravel-permission:~2.29" |
生成数据库迁移文件:
1 |
$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations" |
下图是 laravel-permission 的数据库表结构:
执行迁移文件:
1 |
$ php artisan migrate |
生成配置文件:
1 |
$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config" |
2. 加载 HasRoles
我们还需在 User 中使用 laravel-permission 提供的 Trait —— HasRoles,此举能让我们获取到扩展包提供的所有权限和角色的操作方法。
app/Models/User.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
namespace App\Models; use Spatie\Permission\Traits\HasRoles; #权限管理工具 . . . class User extends Authenticatable { use HasRoles; . . . |
3初始化角色权限
创建数据填充文件,填充一下默认权限的和角色
1 |
$ php artisan make:migration seed_roles_and_permissions_data |
打开迁移文件,书写初始化权限和角色的代码:
database/migrations/{timestamp}_seed_roles_and_permissions_data.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<?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(); } } |
发布默认角色和权限:
1 2 |
$ php artisan migrate:refresh --seed $ php artisan migrate #或者是这个 |
指定角色为站长:
1 2 3 |
$ php artisan tinker >>> $user = App\Models\User::find(101); >>> $user->assignRole('Founder'); |
指定角色为维护者:
1 2 |
>>> $user2 = App\Models\User::find(102); >>> $user2->assignRole('Maintainer'); |
4权限部署
app/Policies/Policy.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
. . . public function boot() { . . . Horizon::auth(function ($request) { return \Auth::user()->hasRole('Founder'); }); } . . . |
注册地平线服务
config/app.php
1 2 3 4 5 6 7 8 9 10 11 |
. . . 'providers' => [ . . . App\Providers\HorizonServiceProvider::class, #Horizon 地平线服务 . . . |
5. laravel-permission简单用法
新建角色:
1 2 3 |
use Spatie\Permission\Models\Role; $role = Role::create(['name' => 'Founder']); |
为角色添加权限:
1 2 3 4 |
use Spatie\Permission\Models\Permission; Permission::create(['name' => 'manage_contents']); $role->givePermissionTo('manage_contents'); |
赋予用户某个角色:
1 2 3 4 5 6 7 8 |
// 单个角色 $user->assignRole('Founder'); // 多个角色 $user->assignRole('writer', 'admin'); // 数组形式的多个角色 $user->assignRole(['writer', 'admin']); |
检查用户角色:
1 2 3 4 5 6 7 8 |
// 是否是站长 $user->hasRole('Founder'); // 是否拥有至少一个角色 $user->hasAnyRole(Role::all()); // 是否拥有所有角色 $user->hasAllRoles(Role::all()); |
检查用户权限:
1 2 3 4 5 6 7 8 9 10 11 12 |
// 检查用户是否有某个权限 $user->can('manage_contents'); // 检查角色是否拥有某个权限 $role->hasPermissionTo('manage_contents'); 直接给用户添加权限: // 为用户添加『直接权限』 $user->givePermissionTo('manage_contents'); // 获取所有直接权限 $user->getDirectPermissions() |