【问题标题】:As correctly use policies in laravel 5.2? I can not在 laravel 5.2 中正确使用策略?我不能
【发布时间】:2016-07-19 11:40:21
【问题描述】:

我有一个问题,我无法在 laravel 5.2 中使用策略。

我有 2 张桌子,studentstasks

我尝试通过更改 URL 来应用策略以防止编辑任务,但我总是收到消息此操作未经授权,尽管该任务是正确的用户。

政策代码:

  <?php

    namespace App\Policies;

    use App\Models\Student;
    use App\Models\Task;

    class TasksPolicy
    {
        public function edit(Student $student, Task $tasks)
        {
            return $student->id === $tasks->student_id;
        }
    }

AuthServiceProvider.php 中的代码

<?php

    namespace App\Providers;

    use App\Models\Task;
    use App\Policies\TasksPolicy;

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

然后在TaskController.php文件中调用:

    public function edit($id)
    {
        $tasks = Task::findOrFail($id);
        $this->authorize('edit', $tasks);
        return view('tasks.edit', compact('tasks'));
    }

我认为代码很好,因为我已经修改了好几次,但正如我之前所说,我总是收到消息此操作未经授权,尽管任务是编辑用户。

http://i.imgur.com/2q6WFb3.jpg

我做错了什么?因为我可以正确使用政策?

【问题讨论】:

  • 我不认为它打算在两个模型之间使用。其中之一必须User 模型。
  • 嗨,表用户为其他用户使用它,所以我必须使用学生表(我使用的是多身份验证 laravel 5.2)。
  • 如果你在edit()方法中dd($student-&gt;id, $tasks-&gt;student_id)会得到什么?
  • 您好,很抱歉延迟回复。如果我按照我说的那样做,例如,我会为每个表 (1, 1) 获得正确的 id。我已经使用了用户策略表,我没有遇到任何问题。显然学生表是有问题的表。

标签: php laravel policies


【解决方案1】:

您正在使用“===”,这意味着侧数据和数据类型都将匹配。可能是您的数据匹配,而不是数据类型,您可以尝试使用“==”

public function edit(Student $student, Task $tasks)
    {
        return $student->id == $tasks->student_id;
    }

【讨论】:

  • 同样的结果。感谢您的帮助。
  • 文档说的不是什么大问题,事实是我们根据需要使用运算符
【解决方案2】:

两件事:一是方法的名称,二是参数的顺序。方法名称应该是“更新”,而不是“编辑”——这些是预定义的,至少在 Laravel 的更高版本中是这样。您可能会收到授权错误,因为 Laravel 无法识别名称 'edit',因此从未定义更新策略。

参数的顺序也很重要。当有参数传递给策略方法时,用户模型必须是第一个参数,然后是所有其他参数。

public function update(User $user, [... other objects...])

所以,你有

update(User $user, Student $student, Task $tasks)

Laravel 将注入经过身份验证的用户模型,但其他对象必须直接传递。

$this->authorize('edit', $student, $tasks);

希望这会奏效。

如果您的 Student 类扩展了 User Class,您可能会认为可以在方法原型中用 Student 代替 User。你不能那样做——那是完全不同的方法。

【讨论】:

  • 请在您的答案中添加一些解释,以便其他人可以从中学习
  • 对不起。这是我的第一篇文章:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 2016-09-11
相关资源
最近更新 更多