Laravel: запретить пользователю доступ к указанному c ресурсу - PullRequest
0 голосов
/ 26 марта 2020

У меня есть приложение api в моей заявке. В настоящее время существует маршрут 'domain.com/posts/:id', который возвращает указанный c пост по идентификатору. Все пользователи имеют доступ к нему. Но я хочу разрешить пользователю видеть сообщение, если только он является автором или редактором этого сообщения:

В моей таблице сообщений есть столбцы author_id и editor_id. Оба столбца ссылаются на идентификатор пользовательской таблицы.

Это хорошая практика, чтобы решить эту проблему с помощью middlware / (создать промежуточное программное обеспечение только для одного маршрута?). Какие-либо предложения ?

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Вы можете использовать авторизацию / политику или Гейтс, предоставленный laravel.

или просто для простоты,

в вашей модели Post

public function canView()
{
    return $this->author_id === auth()->id() || $this->editor_id === auth()->id();
}

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

public function show(Post $post)
{
    //you already have the $post
    if(! $post->canView()) {
        // cannot view post
    }

   // can view post.
}

Следуя этому пути, вы можете Легко используйте один и тот же источник правды для авторизации во всем приложении, так как вы, вероятно, будете использовать экземпляр eloquent во всем приложении.

Если ваша логика c более сложная, обратитесь к Laravel. Политика

0 голосов
/ 26 марта 2020

Эту проблему можно решить с помощью промежуточного программного обеспечения или просто путем проверки пользователя в методе контроллера. Вот простой пример того, как это сделать в методе контроллера:

public function view(Request $request, Post $post) {
    // Currently logged in user.
    $user = auth()->user();
    // Check if the current user is either the author or editor.
    if ($user->id == $post->author_id || $user->id == $post->editor_id) {
       // Your controller logic.
    }
    abort(403);
}

Редактировать: я рекомендую изменить шаблон маршрута на domain.com/posts/:post, чтобы вы могли использовать привязку модели маршрута в методе контроллера .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...