Laravel 自带了简单的用户授权方案:
Gates 和 Policies $this->authorize () 方法 @can 和 @cannot Blade 命令
不过这种自带的方案不容易实现用户,角色,权限的需求,我们可以使用第三放扩展包—Laravel-permission
1.通过composer安装
composer require "spatie/laravel-permission:~3.0"
2.生成数据库迁移文件
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
3.执行迁移文件 php artisan migrate
4.数据表结构
5.生成配置信息 php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
config/permission.php
6.获取扩展包提供的所有权限和角色的操作方法 在用户模型中使用laravel-permission 提供的 Trait —— HasRoles
User.php
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable implements MustVerifyEmailContract
{
use HasRoles;
常用方法 1.新键角色
use Spatie\Permission\Models\Role;
$role = Role::create(['name' => 'Founder']);
2.给角色添加权限
use Spatie\Permission\Models\Permission;
Permission::create(['name' => 'manage_contents'])//创建权限
$role->givePermissionTo('manage_contents');//将权限赋予角色
3.为用户添加角色
// 单个角色
$user->assignRole('Founder');
// 多个角色
$user->assignRole('writer', 'admin');
4.检查用户是否有相关角色
// 是否是站长
$user->hasRole('Founder');
// 是否拥有至少一个角色
$user->hasAnyRole(Role::all());
// 是否拥有所有角色
$user->hasAllRoles(Role::all());
5.检查用户是否有相关权限
// 检查用户是否有某个权限
$user->can('manage_contents');
// 检查角色是否拥有某个权限
$role->hasPermissionTo('manage_contents');
6.直接给用户添加权限
// 为用户添加『直接权限』
$user->givePermissionTo('manage_contents');
// 获取所有直接权限
$user->getDirectPermissions()
案例 如果用户有管理内容权限则通过
<?php
namespace App\Policies;
use Illuminate\Auth\Access\HandlesAuthorization;
class Policy
{
use HandlesAuthorization;
public function __construct()
{
//
}
public function before($user, $ability)
{
// 如果用户拥有管理内容的权限的话,即授权通过
if ($user->can('manage_contents')) {
return true;
}
}
}