php - Laravel 'can' 中间件返回错误 500 “此操作未经授权”
问题描述
我正在尝试创建一个基于 laravel 框架的网站。我陷入了策略的权限控制中。这是我的代码: + 政策注册App\Providers\AuthServiceProvider
:
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
User::class => UserPolicy::class,
Category::class => CategoryPolicy::class
];
public function boot()
{
$this->registerPolicies();
try {
Permission::all()->each(function($permission) {
Gate::define($permission->name, function ($user) use($permission) {
return $user->hasPermission($permission->name);
});
});
} catch (\Exception $e) {
Log::notice('Unable to register gates. Either no database connection or no permissions table exists.');
}
}
}
- 用户政策
App\Policies\UserPolicy
class UserPolicy
{
use HandlesAuthorization;
public function viewAny(User $user)
{
return true;
}
public function view(User $user, User $target_user)
{
return $user->id === $target_user->id;
}
}
- Api 路由在
routes/api.php
Route::get('/users', 'Api\UserController@getUsers')->middleware('can:view-users');
Route::get('/users/{user_id}', 'Api\UserController@getUser')->middleware('can:view-users');
Route::put('/users/{user_id}', 'Api\UserController@updateUser')->middleware('can:edit-users');
- 用户控制器在
App\Http\Controllers\Api\UserController
public function getUsers(UserRequest $request) {
$users = $this->userRepository->getAll();
$this->authorize('view', $user);
return response($users, 200);
}
public function getUser(UserRequest $request, $user_id) {
$user = $this->userRepository->find($user_id);
$this->authorize('view', $user);
return response($user, 200);
}
- 当我尝试使用上面的 2 个 url 获取数据时,
500 Internal Server Error
即使用户经过身份验证,它也会返回错误:
{
"error": "This action is unauthorized."
}
- 我尝试记录结果,发现错误来自中间件
can
或Illuminate\Auth\Middleware\Authorize
.
代码行:
$this->gate->authorize($ability, $this->getGateArguments($request, $models));
在handle()
上面的函数中抛出错误。
- 经过数小时的搜索,我无法找到解决方案。
谁能指出我的错误?
解决方案
解决了。经过数小时阅读库中的源代码后,我发现了问题。我在没有模块的情况下为我的应用程序使用api
了警卫。因此,类passport
中的变量无法设置为经过身份验证的用户并获得值。为了解决这个问题,我创建了自己的中间件而不是 laravel 中间件并用于获取经过身份验证的用户。$userResolver
Illuminate\Auth\Access\Gate
null
Authorize
Authorize
Auth::guard('api')->user()
推荐阅读
- haproxy - 如何在“haproxy”前端指定端口范围?
- java - 更改 Kafka 配置 max.poll.interval.ms 导致一个消费者卡在(重新)加入组
- javascript - 无法在nestjs中模拟elasticsearch服务
- java - 将 grails 2.x 应用程序升级到 Grails 3.2.9 时出现问题
- javascript - 无法在 Botpress (axios) 上使用外部 API
- reactjs - React Hooks:“useMutationEffect”和“useLayoutEffect”有什么区别?
- python - Python打印二进制数的格式
- azure-devops - 作为本地系统运行时,VSTS 代理服务无法获取代码覆盖率数据
- c# - 当前的 .Net SDK 不支持针对 .Net Core 2.2 目标 .Net Core 2.1 或更低版本
- asp.net - List 的返回类
和 int 从 Action 到另一个 Action ASP.Net MVC