使用laravel的policy,访问接口总是显示403 THIS ACTION IS UNAUTHORIZED,怎么解决啊

1. 运行环境

1). 当前使用的 Laravel 版本?

8.75

2). 当前使用的 php/php-fpm 版本?

PHP 版本:
7.4

3). 当前系统

CentOS 8

4). 业务环境

开发环境

2. 问题描述?

控制器代码

<?php

namespace App\Http\Controllers;

use App\Http\Requests\UserLoginRequest;
use App\Http\Resources\UserResource;
use App\Models\User;

class UserController extends Controller
{
    public function index()
    {
        $this->authorize('viewAny', User::class);

        return UserResource::collection(User::all());
    }

    public function store(UserLoginRequest $request)
    {
        $this->authorize('create', User::class);

        return new UserResource(User::create($request->validated()));
    }

    public function show(User $user)
    {
        $this->authorize('view', $user);

        return new UserResource($user);
    }

    public function update(UserLoginRequest $request, User $user)
    {
        $this->authorize('update', $user);

        $user->update($request->validated());

        return new UserResource($user);
    }

    public function destroy(User $user)
    {
        $this->authorize('delete', $user);

        $user->delete();

        return response()->json();
    }
}
?>

policy代码

<?php

namespace App\Policies;

use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class UserPolicy
{
    use HandlesAuthorization;

    public function viewAny(User $user): bool
    {
        return true;
    }

    public function view(User $user, User $model): bool
    {
    }

    public function create(User $user): bool
    {
        return true;
    }

    public function update(User $user, User $model): bool
    {
    }

    public function delete(User $user, User $model): bool
    {
    }

    public function restore(User $user, User $model): bool
    {
    }

    public function forceDelete(User $user, User $model): bool
    {
    }
}

4. 您实际得到的结果?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

首先,您需要确定您的请求是否符合您定义的策略。如果符合,则可能是因为您没有为该策略定义授权方法。

在您的策略类中,您需要定义一个名为authorize的方法,以检查用户是否有权执行该操作。例如:

public function authorize($user, $post)
{
    // Check if the user is the owner of the post
    return $user->id === $post->user_id;
}
如果授权失败,您可以返回false或抛出AuthorizationException异常。例如:


public function authorize($user, $post)
{
    if ($user->id !== $post->user_id) {
        throw new AuthorizationException('You are not authorized to perform this action.');
    }

    return true;
}
如果您已经定义了授权方法并且请求仍然被拒绝,则可能是因为您没有为该策略定义适当的路由中间件。您需要在路由中间件中指定策略类,例如:


Route::get('/posts/{post}', function (Post $post) {
    // Use the "view" policy to authorize the request
})->middleware('can:view,post');

请确保您已经正确设置了策略类和路由中间件,并且您的请求符合您定义的策略。如果问题仍然存在,请检查您的身份验证和授权逻辑是否正确。

11个月前 评论

你直接访问是没有用户的授权信息的。也就是auth()->user()为空,这时候是无法进入你的UserPolicy鉴权的,你可以把User改为可为空?User $user尝试一下

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!