0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel 【入門】Policy URLを直接打ち込んでページに不正アクセスされるのを防ぐ!

Last updated at Posted at 2021-11-07

はじめに

ページのURLを知られると他人の下書き記事にもアクセスできてしまいます。
例えばQiitaの記事編集画面のURL(下記URLの赤い部分)を打ち変えれば、他人の記事下書き編集画面にアクセスできてしまいます・・・と言いたいところですが、さすがにアクセス出来ないように処理されています。
このように不正な直リンクを防止するPolicyという機能があるので、実装方法をシンプルに紹介します。

【qiitaの下書き記事のURL】
qiita.com/drafts/この部分/edit

目次

  1. Policyファイル作成
  2. Policyファイル編集
  3. ControllerにPolicyを追加

Policyファイル作成

ArticlePolicyの部分は任意に変更して下さい。
今回はQiitaの記事なので、Article(記事)という名前のポリシーファイルを作成します。
※命名規則はアッパーキャメル

$ php artisan make:policy ArticlePolicy

Policyファイル編集

app/Policies/ArticlePolicy.phpに移動します。
editArticleを追記し、その中に条件を記述します。この条件がtrueになるもののみ下書き記事にアクセスできる様にします。

<?php

namespace App\Policies;

// Articleモデルをuse宣言
use App\Models\Article;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class ArticlePolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    // 下記追加
    public function editArticle(User $user, Article $article)
    {
        // ログインしているユーザーのid($user->id)と
           記事を書いたユーザー($article->user_id)のidが同じならture
        return $user->id === $article->user_id;
    }
}

ControllerにPolicyを追加

PolicyのeditArticleがtrueの場合のみ、記事の下書きページに遷移できる様になります。
それ以外のユーザーはHTTPレスポンス403の画面に遷移する為、他人の記事に不正アクセス出来ません。

// ArticleController.php

public function edit(Article $article)
{
    // 下記追記
        $this->authorize('editArticle', $article);
    return view('user.article.edit', ['article' => $article]);
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?