Laravel 5.7 + Spatie 权限 + JWT 身份验证

Posted

技术标签:

【中文标题】Laravel 5.7 + Spatie 权限 + JWT 身份验证【英文标题】:Laravel 5.7 + Spatie Permissions + JWT auth 【发布时间】:2019-04-30 11:43:08 【问题描述】:

我正在使用 Laravel 5.7 设置一个 REST API。为了验证身份验证我使用JWT-auth,对于权限和角色我使用Spatie。

我的问题:尝试将角色链接到用户时出现以下错误

Spatie \ Permission \ Exceptions \ RoleDoesNotExist
There is no role named admin.

该角色确实存在于数据库中:

这就是我尝试为用户分配角色的方式:

$user = User::findOrFail(1);
$user->assignRole('admin');

由于我是 Laravel 新手,我不确定它是否相关,但设置 JWT 我必须将 config/auth.php 中的警卫驱动程序更改为 jwt

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

我看不出我做错了什么。我添加了角色,然后尝试将角色添加到用户。

【问题讨论】:

你安装了所有的包吗? @AkhtarMunir 是的,所有包,所有步骤 Spatie 是开发者顺便说一句。包是laravel-permissions 我之所以提出这个只是因为 Spatie 是一家相当受欢迎的公司,从事开源开发,尤其是各种 laravel 包 您是否手动将这些角色添加到数据库中? 【参考方案1】:

如果其他答案都没有解决您的问题

检查您是否正在使用队列 如果是这样的话 重启队列

【讨论】:

【参考方案2】:

Guard 已从 web 更改为 api 但仍尝试从数据库中查找 web 分配这样的角色。

$roleToAssign = Role:: findByName('administrator', 'api');
$user->assignRole($roleToAssign);

#Link

【讨论】:

【参考方案3】:

我假设您已手动将角色添加到数据库中。角色被缓存,如果您不使用内置的 create 方法,则会导致问题。

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

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);

From the GitHub docs

您需要使用php artisan cache:clear 手动清除缓存。

更好的方法是使用播种器(用于永久角色)或Tinker 运行代码以创建角色和权限,这将触发缓存被清除。

【讨论】:

我通过代码添加,而不是直接在数据库中。感谢您的回答!【参考方案4】:

检查您的应用命名空间。如果您是从App 更新的,请务必在config/auth.php 进行更新。

另一方面,如果您没有更新 App 命名空间,请尝试清除缓存并重新设置数据库表的种子。

php artisan config:cache
php artisan cache:clear

另外如果您有protected $guard_name = 'api';,请检查用户模型。

希望这会有所帮助。干杯!

【讨论】:

以上是关于Laravel 5.7 + Spatie 权限 + JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 laravel 中为 spatie 包(ACL 管理)中的其他角色分配用户列表权限?

如何在 laravel spatie 中分配多个角色和基于多个角色的权限?

php WIP:Spatie Laravel许可 - 延长给予和撤销使用给定防护名称的权限

Laravel 在 spatie-permission 的 foreach 循环中给出错误

为啥我的模型在关系子查询中看不到 spatie 权限特征方法?

未创建实例 Spatie 角色和权限