我无法让策略在我的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:此操作未经授权.我希望有人能帮我解决我的问题.谢谢

我还try 修改AuthServiceProvider文件,但没有任何更改.

推荐答案

您正在try 验证该用户是否具有访问该页面的权限.确保try 访问该页面的用户是用户,以便策略可以授权或不授权.

要在没有初学者工具包的情况下进行测试,请创建一个用户并使用该用户登录.

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;

class UserController extends Controller
{
    public function index()
    {
        // create a new user
        $user = \App\Models\User::factory()->create();

        // login with the created user
        Auth::login($user);
        $this->authorize('viewAny', \App\Models\User::class);
        return response("Hello world");
    }
}

但是,如果您希望授予访客用户访问权限,则可以使用?符号使User型号成为可选的:

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

Laravel相关问答推荐

未将Laravel Blade属性传递给组件或类

Laravel:在 PHPUnit 的覆盖率报告中包含文件夹(如果在 app/ 文件夹之外)?

Laravel 5 如何配置 Queue 数据库驱动程序以连接到非默认数据库?

仅针对字母的 laravel 验证规则

安卓 retrofit |发布自定义对象(将 json 发送到服务器)

Laravel 5.4 中的自定义助手类

在 laravel 5 中的表单请求验证后传递旧输入

如何在 Laravel 中显示渲染时间/页面加载时间?

在表单中添加一对多 - Backpack laravel

Array_unique 上一个 laravel Eloquent的集合

在 Laravel 中将 Public 添加到assets资源路径

Laravel 随机排序

如何在 Laravel 中实现数组类型路由?

如何使用命令行手动运行 laravel/lumen 作业(job)

脚本 php artisan clear-compiled 处理 pre-update-cmd 事件返回错误(Laravel 4.1 升级)

在 Laravel 中将 Eloquent 导出到 Excel 时如何包含列标题?

Laravel Eloquent 模型属性

如何在脚本文件中使用 Laravel Blade?

使用迁移更改表 Laravel 5

Laravel 5.2 |测试 UploadedFile 在发布后错过了 $test 值?