Laravel 多角色用户权限

2022-09-14 15:01:43 浏览数 (2)

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.数据表结构

  1. roles —— 角色的模型表;
  2. permissions —— 权限的模型表;
  3. model_has_roles —— 模型与角色的关联表,用户拥有什么角色在此表中定义,一个用户能拥有多个角色;
  4. role_has_permissions —— 角色拥有的权限关联表,如管理员拥有查看后台的权限都是在此表定义,一个角色能拥有多个权限
  5. 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;
        }
    }
}

0 人点赞