You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel8中Spatie Roles and Permission如何修改默认模型而非使用User模型

Laravel 8 搭配的 Spatie Roles and Permission v4 及以上版本完全支持绑定非默认User模型的其他自定义模型做角色、权限相关操作,完整配置流程如下:

前置准备

首先确保你已经完成Spatie权限包的基础安装:

  • 已通过composer安装适配Laravel8的v4版本权限包:composer require spatie/laravel-permission:^4.0
  • 已执行发布命令生成配置文件和迁移文件:php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
  • 已执行迁移生成权限相关数据表:php artisan migrate
配置流程

1. 配置自定义模型对应的Auth守卫

打开config/auth.php,新增自定义模型对应的守卫和用户提供者,示例以Admin自定义模型为例:

return [
    // ... 其他原有配置
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        // 新增Admin模型对应的守卫
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
        // 新增Admin模型对应的用户提供者
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ],
    ],
    // ... 其他原有配置
];

2. 给自定义模型引入权限Trait

在你的自定义模型(示例为App\Models\Admin)中引入HasRoles Trait:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class Admin extends Authenticatable
{
    use HasFactory, HasRoles; // 必须引入HasRoles Trait

    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];
}

3. 创建对应守卫的角色和权限

创建角色、权限时需要指定对应的guard_name为你新增的守卫名:

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

// 创建admin守卫下的角色
$adminRole = Role::create([
    'name' => '超级管理员',
    'guard_name' => 'admin'
]);

// 创建admin守卫下的权限
$editUserPerm = Permission::create([
    'name' => '编辑用户',
    'guard_name' => 'admin'
]);

// 给角色绑定权限
$adminRole->givePermissionTo($editUserPerm);

4. 权限操作使用示例

给自定义模型对象分配角色、校验权限时,指定对应守卫即可:

$admin = Admin::find(1);
// 分配角色
$admin->assignRole('超级管理员');
// 校验权限
var_dump($admin->hasPermissionTo('编辑用户')); // 输出bool(true)
// 中间件校验时指定守卫
Route::group(['middleware' => ['auth:admin', 'role:超级管理员,admin']], function () {
    // 管理员后台路由
});
注意事项
  • 配置修改后如果不生效,先执行命令清空缓存:php artisan cache:clear、php artisan config:clear,Spatie权限包默认会缓存权限配置,清缓存后才会加载最新配置。
  • 如果有多个自定义模型需要做权限控制,只需要给每个模型都引入HasRoles Trait,分别配置对应的守卫即可,不同守卫下的角色、权限互相隔离,不会冲突。

内容的提问来源于stack exchange,提问作者dev__rezo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 10:09:04