Laravel 中的策略对我不起作用,这是我的代码

问题描述 投票:0回答:2

我无法让策略在我的 Laravel 项目中工作,我安装了一个新项目来从头开始测试,我有这个控制器:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;

class UserController extends Controller
{
    public function index()
    {
        $this->authorize('viewAny', auth()->user());
        return response("Hello world");
    }
}

本政策:

<?php

namespace App\Policies;

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

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

这是我的模型

<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
        'password' => 'hashed',
    ];
}

我收到错误 403:此操作未经授权。我希望有人能帮助我解决我的问题。谢谢你

我也尝试过修改AuthServiceProvider文件,但没有任何改变。

laravel policy
2个回答
0
投票

必须在 App\Providers\AuthServiceProvider 中添加您的策略吗?

protected $policies = [
    User::class => UserPolicy::class
];

0
投票

您需要指定您正在使用的模型。具体来说,就是

User
。因此,传递当前登录的用户:

$this->authorize('viewAny', auth()->user());

此外,您正在尝试验证用户是否有权访问该页面。确保尝试访问该页面的人是用户,以便策略可以授权或不授权。

要在没有入门套件的情况下进行测试,请创建一个用户并使用它登录。

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;

class UserController extends Controller
{
    public function index()
    {
        $user = \App\Models\User::factory()->create();
        Auth::login($user);
        $this->authorize('viewAny', auth()->user());
        return response("Hello world");
    }
}

但是,如果您希望授予访客用户访问权限,您可以使用

?
符号将
User
模型设为可选:

public function viewAny(?User $user)
{
    return true;
}
© www.soinside.com 2019 - 2024. All rights reserved.