使用Laravel-permission时有正确的permission还是报403错误
1. 运行环境
1). 当前使用的 Laravel 版本?
9.22.1
2). 当前使用的 php/php-fpm 版本?
PHP 版本:8.1.8
php-fpm 版本:8.1.8
3). 当前系统
ubuntu:22.04
4). 业务环境
开发环境
5). 相关软件版本
laravel/framework:9.22.1
spatie/laravel-permission:5.5.5
2. 问题描述?
用新版本laravel
重构之前项目时碰到的问题,前端是用vue
做的单页面应用,所以前端和服务器之间的数据通信大部分都是通过api
,以前代码正常运行没有问题,但是在新版本中会在Spatie\Permission
检查权限时报错403
UsersController
如下(仅提供了权限检查部分)
public function __construct()
{
$this->middleware('permission:administrator', ['except' => ['getCurrentUser']]);
}
我尝试把permission
改成role
,莫名就能正常检查到权限了,然后我仔细检查了授权情况,确认用户是具有对应权限的,在前端查询权限时返回的数据如下
hasP: false
hasR: true
permissions: ["administrator", "eee"]
roles: ["administrator"]
hasP
是$user->hasAnyPermission(['administrator']);
返回的结果,hasR
是$user->hasAnyRole(['administrator']);
返回的结果,能返回两个不同的结果也是把我搞晕了。
后来我用hasAllPermissions
再做权限检查,会报错There is no permission named administrator for guard api.
到这里我有点明白了,于是到permissions
表里把administrator
的guard_name
从web
改成api
,然后清除缓存,成功检查到对应的权限
但是这仍然没有解决我的困惑,roles
表里administrator
的guard_name
也是web
,但是用role
的时候能正常检查到权限,为什么permission
就不行呢?
附上auth.php
中的代码
<?php
return [
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
'hash' => false,
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
],
'password_timeout' => 10800,
];
希望有大佬能解决下我的困惑,为什么role
可以permission
不行?我是否应该把默认的guard_name
都改成api
?
推荐文章: