Php 如果当前用户不是作者,则Laravel拒绝为用户编辑帖子
我有型号Php 如果当前用户不是作者,则Laravel拒绝为用户编辑帖子,php,laravel,Php,Laravel,我有型号Post。如果用户不是此帖子的作者,我如何拒绝编辑帖子 我知道我只能用以下内容向用户显示他的帖子: Auth::user()->posts 因为模型用户有: public function posts() { return $this->hasMany('App\Models\Post'); } 但每个用户都可以使用链接: 编辑陌生人的帖子。我怎样才能防止这种情况 编辑帖子的我的控制器: /** * Show the form for editing the s
Post
。如果用户不是此帖子的作者,我如何拒绝编辑帖子
我知道我只能用以下内容向用户显示他的帖子:
Auth::user()->posts
因为模型用户有:
public function posts() {
return $this->hasMany('App\Models\Post');
}
但每个用户都可以使用链接:
编辑陌生人的帖子。我怎样才能防止这种情况
编辑帖子的我的控制器:
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit(Post $post)
{
$cats = Categories::all();
return view('sites.edit', compact('cats'));
}
我创建了策略:
public function edit(User $user, Post $post) {
return $user->id === $post->user_id;
}
我可以向其他用户显示编辑表单post。。为什么?你需要的是授权 通过运行以下命令创建策略:
php artisan make:policy PostPolicy
然后在服务提供商中注册creted策略:
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
Post::class => PostPolicy::class,
];
/**
* Register any application authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
//
}
注册策略后,可以为其授权的每个操作添加方法。例如,让我们在PostPolicy上定义一个update方法,该方法确定给定用户是否可以更新给定的Post实例
更新方法将接收一个User
和一个Post
实例作为其参数,并应返回true或false
,指示用户是否有权更新给定的Post。因此,在本例中,让我们验证用户id是否与帖子上的user\u id
匹配:
<?php
namespace App\Policies;
use App\User;
use App\Post;
class PostPolicy
{
/**
* Determine if the given post can be updated by the user.
*
* @param \App\User $user
* @param \App\Post $post
* @return bool
*/
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}
控制器中的:
public function edit(Post $post)
{
if(Auth::user()->id==$post->user->id){
$cats = Categories::all();
return view('sites.edit', compact('cats'));
}else{
// redirect user to home page
return redirect('/home');
}
}
您可以在“编辑方法”中手动检查帖子所有者,或使用“读取当前用户”检查帖子所有者,然后查看其是否与帖子作者相同。在edit()方法中执行此操作。我没有写一个详细的答案,因为我和拉威尔合作的时间太长了。看一看,没有。没有工作。我可以显示编辑表单不重要您仍然必须在控制器方法中调用authorize
,它才能工作。@Dumitru您在实现它时必须非常小心,它才能工作。请在控制器中执行方法编辑的示例?我需要做什么?