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="SpatiePermissionPermissionServiceProvider" --tag="migrations"
3.执行迁移文件 php artisan migrate
4.数据表结构
- roles —— 角色的模型表;
- permissions —— 权限的模型表;
- model_has_roles —— 模型与角色的关联表,用户拥有什么角色在此表中定义,一个用户能拥有多个角色;
- role_has_permissions —— 角色拥有的权限关联表,如管理员拥有查看后台的权限都是在此表定义,一个角色能拥有多个权限
- model_has_permissions —— 模型与权限关联表,一个模型能拥有多个权限。
5.生成配置信息 php artisan vendor:publish --provider="SpatiePermissionPermissionServiceProvider" --tag="config"
config/permission.php
6.获取扩展包提供的所有权限和角色的操作方法 在用户模型中使用laravel-permission 提供的 Trait —— HasRoles
代码语言:javascript复制User.php
use SpatiePermissionTraitsHasRoles;
class User extends Authenticatable implements MustVerifyEmailContract
{
use HasRoles;
常用方法 1.新键角色
代码语言:javascript复制use SpatiePermissionModelsRole;
$role = Role::create(['name' => 'Founder']);
2.给角色添加权限
代码语言:javascript复制use SpatiePermissionModelsPermission;
Permission::create(['name' => 'manage_contents'])//创建权限
$role->givePermissionTo('manage_contents');//将权限赋予角色
3.为用户添加角色
代码语言:javascript复制// 单个角色
$user->assignRole('Founder');
// 多个角色
$user->assignRole('writer', 'admin');
4.检查用户是否有相关角色
代码语言:javascript复制// 是否是站长
$user->hasRole('Founder');
// 是否拥有至少一个角色
$user->hasAnyRole(Role::all());
// 是否拥有所有角色
$user->hasAllRoles(Role::all());
5.检查用户是否有相关权限
代码语言:javascript复制// 检查用户是否有某个权限
$user->can('manage_contents');
// 检查角色是否拥有某个权限
$role->hasPermissionTo('manage_contents');
6.直接给用户添加权限
代码语言:javascript复制// 为用户添加『直接权限』
$user->givePermissionTo('manage_contents');
// 获取所有直接权限
$user->getDirectPermissions()
案例 如果用户有管理内容权限则通过
代码语言:javascript复制<?php
namespace AppPolicies;
use IlluminateAuthAccessHandlesAuthorization;
class Policy
{
use HandlesAuthorization;
public function __construct()
{
//
}
public function before($user, $ability)
{
// 如果用户拥有管理内容的权限的话,即授权通过
if ($user->can('manage_contents')) {
return true;
}
}
}