Laravel запрещает редактировать сообщения для пользователей, если текущий пользователь не является автором - PullRequest
0 голосов
/ 28 мая 2018

У меня есть модель Post.Как я могу запретить редактировать сообщение, если пользователь не является автором этого сообщения?

Я знаю, что могу показывать пользователю только его сообщения с:

Auth::user()->posts

Поскольку у пользователя модели:

public function posts() {
    return $this->hasMany('App\Models\Post');
}

Но каждый пользователь может перейти по ссылке: http://example.com/posts/6/edit

и отредактировать пост незнакомца.Как я могу предотвратить это?

Мой контроллер для редактирования поста:

/**
 * 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;
}

И я могу показать форму редактирования поста другим пользователям.Почему?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

В вашем контроллере:

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');
    }
}
0 голосов
/ 28 мая 2018

Что вам нужно для его авторизации policy

Создайте политику, запустив: php artisan make:policy PostPolicy

Затем зарегистрируйте созданную политику в поставщике услуг:

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, который определяет, может ли данный пользователь обновить данный экземпляр Post.

Метод обновления получит экземпляр User и Post в качестве аргументов, идолжен вернуть true or false, указывая, авторизован ли пользователь для обновления данного сообщения.Итак, для этого примера давайте проверим, что идентификатор пользователя соответствует user_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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...