通过控制器助手授权:方法 authorize() 不存在 - Laravel 5.5

Posted

技术标签:

【中文标题】通过控制器助手授权:方法 authorize() 不存在 - Laravel 5.5【英文标题】:Authorization via Controller helper: Method authorize() does not exists - 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......只是在文件的顶部,它本身不会做任何事情 【参考方案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');
    

    // ...

【讨论】:

以上是关于通过控制器助手授权:方法 authorize() 不存在 - Laravel 5.5的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 中的授权属性

JWT 请求无法通过授权策略

如果在 laravel 5.1 中未授权操作,则通过 ajax 显示错误

授权角色 WebAPI oauth owin

授权角色 WebAPI oauth owin

拦截asp.net core Authorize action,授权成功后执行自定义动作