はじめに
ページのURLを知られると他人の下書き記事にもアクセスできてしまいます。
例えばQiitaの記事編集画面のURL(下記URLの赤い部分)を打ち変えれば、他人の記事下書き編集画面にアクセスできてしまいます・・・と言いたいところですが、さすがにアクセス出来ないように処理されています。
このように不正な直リンクを防止するPolicyという機能があるので、実装方法をシンプルに紹介します。
【qiitaの下書き記事のURL】
qiita.com/drafts/この部分/edit
目次
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]);
}