Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉威尔政策总是错误的_Php_Laravel_Laravel 5_Laravel 5.4 - Fatal编程技术网

Php 拉威尔政策总是错误的

Php 拉威尔政策总是错误的,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 ];

我试图允许用户在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 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
)是要查看的用户。回答自己的问题不要感到不舒服,这是一种非常值得欣赏的方式,可以丰富本网站的内容并帮助他人。