为什么我的 view-policy 有效,但我的 viewAny-policy 无效?

Why does my view-policy work, but my viewAny-policy not?

我用 php artisan make:policy StudentPolicy --model=Student 生成了一个策略。在此策略中,您有一个 view 和 viewAny 方法。当我正常测试它时,viewAny 应用于 index() 和 view 应用于 show(),但只有视图策略有效,viewAny 无效。我们仍然可以访问页面 localhost/student

如果我们将viewAny中的return值设置为false或true。它没有效果。 php artisan route:list 的输出如下所示。

|        | POST      | student                               | student.store             | App\Http\Controllers\StudentController@store                           | web,can:create,App\Models\Student

|        | GET|HEAD  | student                               | student.index             | App\Http\Controllers\StudentController@index                           | web

|        | GET|HEAD  | student/create                        | student.create            | App\Http\Controllers\StudentController@create                          | web,can:create,App\Models\Student

|        | GET|HEAD  | student/{student}                     | student.show              | App\Http\Controllers\StudentController@show                            | web,can:view,student

|        | PUT|PATCH | student/{student}                     | student.update            | App\Http\Controllers\StudentController@update                          | web,can:update,student

|        | DELETE    | student/{student}                     | student.destroy           | App\Http\Controllers\StudentController@destroy                         | web,can:delete,student

|        | GET|HEAD  | student/{student}/edit                | student.edit              | App\Http\Controllers\StudentController@edit                            | web,can:update,student

AuthServiceProvider

    protected $policies = [
        // 'App\Model' => 'App\Policies\ModelPolicy',
        Student::class => StudentPolicy::class,

    ];

学生政策

   public function viewAny(User $user)
    {
        //
        return in_array('view.student.all', $user->rights()->pluck('description')->toArray());
    }

    /**
     * Determine whether the user can view the student.
     *
     * @param  \App\Models\User  $user
     * @param  \App\Models\Student  $student
     * @return mixed
     */
    public function view(User $user, Student $student)
    {
        //
        return in_array('view.student.all', $user->rights()->pluck('description')->toArray());
    }

学生控制器

class StudentController extends Controller
{

    public function __construct()
    {
        $this->authorizeResource(Student::class);
    }

如果用户无权查看Any,则可能无法访问localhost/student,需要显示未经授权的页面。

laravel 不匹配。 如果您使用 Artisan 创建一个策略,它会生成一个 viewAny 方法。 此 viewAny 方法未映射到 resourceAbilityMap 下的 AuthorizesRequests 特征中。如果您更改此映射,请向其添加 'index' => 'viewAny'。 唯一的问题是,当我进行作曲家更新时,它会被覆盖,所以我需要对 Laravel 本身进行拉取请求。