Php Laravel-授权仅从控制器方法起作用

Php Laravel-授权仅从控制器方法起作用,php,laravel,authorization,Php,Laravel,Authorization,我已经设置了我的模型策略,当我从控制器操作中授权操作时,它似乎正在工作 // create action public function create() { $this->authorize('create', BusinessProfile::class); return view('business-profile.create'); } create的策略只返回true或false,切换布尔值似乎可以正常工作,因为我根据它获得了授权 这符合我的政策设置正确 但是,

我已经设置了我的模型策略,当我从控制器操作中授权操作时,它似乎正在工作

// create action
public function create()
{
    $this->authorize('create', BusinessProfile::class);
    return view('business-profile.create');
}
create的策略只返回true或false,切换布尔值似乎可以正常工作,因为我根据它获得了授权

这符合我的政策设置正确

但是,我没有在控制器中的任何地方使用
authorize
方法,而是尝试在构造函数中设置中间件

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('can:create,BusinessProfile')->only('create');
}
Laravel文档显示了这个示例

Route::post('/post', function () {
    // The current user may create posts...
})->middleware('can:create,App\Post');
所以,我在我的控制器构造函数中写了这个

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('can:create,BusinessProfile')->only('create');
}
但是,执行此操作时,操作始终是未经授权的

奖金信息


我继续在我的策略中编写垃圾代码来引发语法错误,但仍然收到一个未经授权的响应,它告诉我我的策略根本没有启动。可能是我没有正确注册我的策略,但如上所述,
$this->authorize(…)
工作正常。

似乎您在模型中使用了别名,但它需要模型名称。在文件国家:

某些操作(如创建)可能不需要模型实例。在这些 在这种情况下,您可以将类名传递给中间件。班级 名称将用于确定授权时要使用的策略 行动:

您可以在此处找到更多信息:

因此,在控制器构造函数中,这一行:

$this->middleware('can:create,BusinessProfile')->only('creat‌​e'); 
将成为:

$this->middleware('can:create,App\BusinessProfile')->only('c‌​reate');

您是否尝试过更改
$this->middleware('can:create,BusinessProfile')->仅('create')到$this->中间件('can:create,App\BusinessProfile')->仅('create');`。表示将BusinessProfile的完整类名与命名空间一起使用。如果您可以发布策略的代码,可能会有所帮助。@MIdrees您似乎是对的。我实际做的是将
App\BusinessProfile
化名为
BusinessProfile
,然后只使用
$this->中间件('can:create,BusinessProfile')->('create‌​e')我认为这在Laravel中不起作用。中间件参数必须是完全限定的模型名称。对于已创建模型的操作,它必须是url中参数的名称。也许,你可以把这个答案贴出来,这样我就可以标记它了?但请务必彻底检查。感谢您的理解:)