【问题标题】:Authorization via Controller helper: Method authorize() does not exists - Laravel 5.5通过控制器助手授权:方法 authorize() 不存在 - Laravel 5.5
【发布时间】:2017-12-13 07:58:10
【问题描述】:

我定义了PostPolicy.php 来处理谁可以访问操作。
我正在尝试处理 PUT 请求以更新帖子,但它似乎无法正常工作。

namespace App\Policies;

use App\Models\Users;
use App\Models\Posts;
use Illuminate\Auth\Access\HandlesAuthorization;

class PostPolicy
{
    use HandlesAuthorization;

    public function view(Users $user, Posts $posts)
    {
        return true;
    }

    public function create(Users $user)
    {
        return true;
    }

    public function update(Users $user, Posts $posts)
    {
        return true; //$user->id === $posts->user_id;
    }

    public function delete(Users $user, Posts $posts)
    {
        return $user->id === $posts->user_id;
    }
}

我在AuthServiceProvider.php注册了这个政策

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    App\Models\Posts::class => App\Policies\PostPolicy::class,
];

我的路线:

Route::put('post/update/{id}', 'CMS\PostController@update');

最后,这是我的控制器

namespace App\Http\Controllers\CMS;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use App\Models\Posts as PostModel;
use LRedis;
use Illuminate\Http\Request;

class PostController extends BaseController
{
    public function __construct()
    {

    }

    public function update (Request $request, PostModel $postModel) {
        $this->authorize('update', $postModel);

    }

    public function subcribe () {
    }
}

当我提交表单时,我收到错误Method [authorize] does not exist on [App\Http\Controllers\CMS\PostController].

我正在让我的演示关注documentation

我的错误是什么?我是否遗漏了任何正在进行的内容?

【问题讨论】:

  • 是的,你遗漏了一些东西......你的控制器没有这些方法......看看你应该在你的应用程序中扩展的控制器App\Http\Controllers\Controller......只是在文件的顶部,它本身不会做任何事情

标签: php laravel laravel-5


【解决方案1】:

authorize 方法由 Illuminate\Foundation\Auth\Access\AuthorizesRequests 特征提供。

您可以直接将此 trait 添加到控制器中,也可以让控制器扩展 Laravel 附带的默认控制器 (App\Http\Controllers\Controller),因为它已经具有此 trait(以及 DispatchesJobs 和 @987654325 @)。

【讨论】:

  • 是的,我失踪了。 authorize() 方法有效。但是我得到了错误This action is unauthorized,虽然PostPolicy中的方法update()已经返回true
【解决方案2】:

您应该在项目文件的 App\Providers\AuthServiceProvider.php 文件中声明所有策略。在这种情况下,您必须像这样声明 PostPolicy:

在 AuthServiceProvider.php 中:

protected $policies = [
    // 'App\Model' => 'App\Policies\ModelPolicy',
        Post::class => PostPolicy::class,
];

您可以通过查看官方文档 laravel enter link description here找到更多信息

【讨论】:

    【解决方案3】:

    您可以将 Illuminate\Foundation\Auth\Access\AuthorizesRequests 特征添加到您的控制器

    【讨论】:

    • 这是正确的!谢谢。
    【解决方案4】:

    生成的控制器扩展了默认的 Illuminate\Routing\Controller 而不是通常的 App\Http\Controllers\Controller,就像在全新的 Laravel 安装中一样。

    为了能够使用授权相关的方法,你必须在你的类中使用Illuminate\Foundation\Auth\Access\AuthorizesRequests trait:

    <?php
    namespace Module\Posts\Http\Controllers;
    
    // Add this use statement
    use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
    use Illuminate\Http\Request;
    use Illuminate\Http\Response;
    use Illuminate\Routing\Controller;
    
    class PostController extends Controller
    {
        use AuthorizesRequests;
    
        public function __construct()
        {
            $this->authorizeResource(Post::class, 'post');
        }
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 2020-07-14
      • 2020-04-30
      • 1970-01-01
      • 2018-07-01
      相关资源
      最近更新 更多