通过控制器助手授权:方法 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的主要内容,如果未能解决你的问题,请参考以下文章