【问题标题】:Laravel Policy Ignoring View, Update, and Delete but Create works just fineLaravel 策略忽略查看、更新和删除但创建工作正常
【发布时间】:2017-08-13 23:05:48
【问题描述】:

我正在创建我的第一个 Laravel 策略。我有一个基本新鲜的 laravel 5.4 项目,它有一个项目模型。我创建了一个名为 ProjectPolicy 的策略,但我无法让所有方法都正常工作。

如果我打电话给$user->can('create', Project::class),我会得到“这里”转储,它会返回 true。但是,查看、创建和删除操作永远不会到达 ProjectPolicy。 “这里”永远不会被转储,并且总是返回 false。我想不出或找不到任何理由为什么一种策略方法会起作用而其他策略方法不起作用。我错过了什么?

App\Policies\ProjectPolicy.php

namespace App\Policies;

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

class ProjectPolicy
{
    use HandlesAuthorization;


    /**
     * Determine whether the user has a specific ability for projects.
     *
     * @param  \App\User  $user
     * @param  \App\Project  $project
     * @return mixed
     */
    public function before($user, $ability)
    {
        var_dump('here');
    }

    /**
     * Determine whether the user can view the project.
     *
     * @param  \App\User  $user
     * @param  \App\Project  $project
     * @return mixed
     */
    public function view(User $user, Project $project)
    {
        return true;
    }

    /**
     * Determine whether the user can create projects.
     *
     * @param  \App\User  $user
     * @return mixed
     */
    public function create(User $user)
    {
        return true;
    }

    /**
     * Determine whether the user can update the project.
     *
     * @param  \App\User  $user
     * @param  \App\Project  $project
     * @return mixed
     */
    public function update(User $user, Project $project)
    {
        return true;
    }

    /**
     * Determine whether the user can delete the project.
     *
     * @param  \App\User  $user
     * @param  \App\Project  $project
     * @return mixed
     */
    public function delete(User $user, Project $project)
    {
        return true;
    }
}

AuthServiceProvider.php

namespace App\Providers;

use App\Project;
use App\Policies\ProjectPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        Project::class => ProjectPolicy::class,
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        //
    }
}

【问题讨论】:

  • 您检查日志是否有错误?
  • 刚刚清除了日志并再次运行了所有can 方法。没有任何记录。

标签: php laravel authentication laravel-5 permissions


【解决方案1】:

问题可能是您在调用$user->can('view', Project::class) 时未传递项目实例。尝试调用 $user->can('view', $project),其中 $project 是所有那些在函数定义中需要项目的方法的项目类的实例。

【讨论】:

  • 1) 这样做会引发错误,2) 我正在调用$user->can('view', Project::first()),而我的数据库中只有一个项目。所以应该没问题吧?
  • 我会 dd(Project::first());以确定您传递给函数的确切内容。
  • dd(Project::first()) = App\project {#667 id: 1, name: "My First Project", created_at: "2017-03-21 01:50:33", updated_at: "2017-03-21 01:50:33", }
  • 刚刚注意到,如果我打电话给$user->can('view', Project::class),“这里”就会被丢弃。所以如果我传递了错误的论点,它只看政策吗?大声笑
  • 除了 Project 类没有大写之外,您丢弃的对象似乎很好。我怀疑如果你在 Laravel 日志中没有收到任何错误,它们会被包含在其他地方(即 - 基础 Apache 日志等)。如果传递给函数的对象类型存在问题,则应该生成错误。我将采取的下一步是尝试定位可能在任何相关日志位置生成的任何错误并尝试 dd($user, $project);在其中一个函数中检查它是否在没有 before() 的情况下命中该函数;
猜你喜欢
  • 2012-07-05
  • 2017-07-23
  • 2023-03-16
  • 2021-03-18
  • 2017-03-01
  • 2020-02-12
  • 2019-11-24
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多