【问题标题】:Laravel 'can' middleware return error 500 "This action is unauthorized"Laravel 'can' 中间件返回错误 500 “此操作未经授权”
【发布时间】:2020-02-07 10:54:54
【问题描述】:

我正在尝试创建一个基于 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;
    }

}
  • routes/api.php 中的 API 路由
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."
}
  • 我尝试记录结果,发现错误来自中间件canIlluminate\Auth\Middleware\Authorize

代码行:

$this->gate->authorize($ability, $this->getGateArguments($request, $models));handle()函数上面抛出错误。

  • 经过几个小时的搜索,我找不到解决方案。

谁能指出我的错误?

【问题讨论】:

    标签: php laravel middleware


    【解决方案1】:

    解决了。经过数小时阅读库中的源代码后,我发现了问题。我在没有passport 模块的情况下为我的应用程序使用了api 保护。因此,Illuminate\Auth\Access\Gate 类中的变量$userResolver 无法设置为经过身份验证的用户并获得null 值。为了解决这个问题,我创建了自己的 Authorize 中间件而不是 laravel 中间件 Authorize 并使用 Auth::guard('api')->user() 来获取经过身份验证的用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多