Php 拉威尔政策总是错误的
我试图允许用户在Laravel5.4中查看自己的个人资料 UserPolicy.phpPhp 拉威尔政策总是错误的,php,laravel,laravel-5,laravel-5.4,Php,Laravel,Laravel 5,Laravel 5.4,我试图允许用户在Laravel5.4中查看自己的个人资料 UserPolicy.php public function view(User $authUser, $user) { return true; } protected $policies = [ App\Task::class => App\Policies\TaskPolicy::class, App\User::class => App\Policies\UserPolicy::class ];
public function view(User $authUser, $user)
{
return true;
}
protected $policies = [
App\Task::class => App\Policies\TaskPolicy::class,
App\User::class => App\Policies\UserPolicy::class
];
public function profile()
{
return $this->show(Auth::user()->id);
}
public function show($id)
{
$user = User::find($id);
return view('user.show', array( 'user'=>$user,'data'=>$this->data ) );
}
在AuthServiceProvider.php中注册策略
public function view(User $authUser, $user)
{
return true;
}
protected $policies = [
App\Task::class => App\Policies\TaskPolicy::class,
App\User::class => App\Policies\UserPolicy::class
];
public function profile()
{
return $this->show(Auth::user()->id);
}
public function show($id)
{
$user = User::find($id);
return view('user.show', array( 'user'=>$user,'data'=>$this->data ) );
}
路线
Route::group(['middleware' => 'auth'], function() {
Route::resource('user', 'UserController');
} );
刀片模板
@can ( 'view', $user )
// yes
@else
// no
@endcan
UserController.php
public function view(User $authUser, $user)
{
return true;
}
protected $policies = [
App\Task::class => App\Policies\TaskPolicy::class,
App\User::class => App\Policies\UserPolicy::class
];
public function profile()
{
return $this->show(Auth::user()->id);
}
public function show($id)
{
$user = User::find($id);
return view('user.show', array( 'user'=>$user,'data'=>$this->data ) );
}
返回值总是“false”。对于从控制器调用策略也是如此。哪里出错?解决方案: 将第二个参数从
@can('view',$user)
更改为@can('view',$subject)
,它将正常工作
原因:
因为你做得不对
public function view(User $user, $subject){
return true;
}
只需仔细查看策略视图方法,第一个参数是已验证用户
或当前用户
,第二个参数是$subject
,因为策略围绕模型组织授权逻辑
策略是围绕一个应用程序组织授权逻辑的类
特定的模型或资源。例如,如果您的应用程序是
博客,您可能有一个帖子模型和相应的后期策略
授权用户操作,如创建或更新帖子
如果你想深入了解它
请参阅最后一行,在该行中,它使用$user调用方法,并传递$argument(在我们的案例模型中)
这里是一种不同的方法,用户可以查看自己的个人资料 首先,我将为此创建一个路由
Route::group(['middleware' => 'auth'], function() {
Route::get('profile', 'UserController@profile');
});
然后在profile
函数中
public function profile()
{
$user = Auth::user();
return view('profile', compact('user'));
}
这样,用户自动只查看自己的配置文件
现在,如果您希望允许某些用户查看其他用户的配置文件,则可以使用策略。为什么?因为我认为用户应该总是能够查看自己的个人资料。但并非所有用户都应该查看其他用户的个人资料。回答我自己的问题感觉很奇怪,但我讨厌遇到没有后续跟进的问题 所以在仔细检查之后,如果我从构造函数中删除:
public function __construct()
{
$this->authorizeResource(User::class);
}
并检查控制器功能中的授权:
$this->authorize('view',$user);
一切正常。
在策略函数中添加$user
作为参数时,我一定错过了这一部分。因此,要查看的用户永远不会在authorizeResource
方法中传递
感谢大家抽出时间来帮助我。当您添加
public function __construct()
{
$this->authorizeResource(User::class);
}
对于控制器,您必须编辑所有功能签名以使其与类匹配,例如,您的显示签名必须从公共功能显示($id)
至公共功能显示(用户$User)
在这之后,它应该可以工作了,可以使用authorizeResource中的选项参数对一个或多个策略方法进行转义,除了:
public function __construct()
{
$this->authorizeResource(User::class, 'user', ['except' => ['view']]);
}
这应该在Laravel的文档中,但不是。我发现这只是猜测。我认为这是一种更好的方法,因此,通过删除
构造中的授权资源
方法,有必要为每个资源操作实施授权
方法,以保护控制器。感谢您的回答。实际上,我的目的是允许父用户查看/编辑自己的个人资料和子用户资料(如老板和他的员工)。因此,员工只能查看自己的个人资料,而老板只能查看/编辑自己的员工,而不能查看/编辑其他老板的员工。我简化了我的示例,因为实际的问题是为什么我的策略文件中的函数返回false
,即使我编写了返回true
然后尝试重新定义策略,如公共函数视图(用户$parent,用户$User)
;不过,我不确定这是否会有所不同。但是在尝试中没有什么可以放松的。还尝试重写刀片模板,如@if(Auth::user()->can('view',$user))
。我不认为语法有什么问题。@cannnot('view',$user)
也给了我这个动作是未经授权的。
通常当某些东西对我不起作用时,我实际上是在寻找解决办法。我想起来了。您不希望用户查看其他上司的员工。在视图中使用@can()。我认为你甚至不应该显示页面。因此,您可以在控制器中进行快速检查,并在未授权的情况下将其重定向到主页。那个应该更简单。谢谢你的回答。很可能我的参数名有误导性,对此表示抱歉。我想要的是将authenticated user
作为第一个参数传递,将要查看的用户作为第二个参数传递。我编辑了我的答案,以显示我从控制器传递了$user
,然后我在刀片@can('view',$user)
中使用了相同的变量名$user
(以前称为$subject
)是要查看的用户。回答自己的问题不要感到不舒服,这是一种非常值得欣赏的方式,可以丰富本网站的内容并帮助他人。