0
2

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 3 years have passed since last update.

【Laravel】ユーザー専用ページのURLを直接入力された場合への対処【認可】

Last updated at Posted at 2022-01-20

環境:Laravel 6.2
※※初学者が書いています。おかしな部分など有りましたら教えて頂けると嬉しいです。※※※

ケース1:ログインユーザー専用のページを非ログインユーザーに見られたくない

状況

ログインユーザー専用のページ「ページA」があるとする。
ページAは非ログインユーザーには見られたくない。

ページAへのリンクを@auth@endauth で囲めば
リンクはログインユーザーにしか表示されなくなる。
しかし、ページAのURLをブラウザのアドレスバーに直接入力すれば
非ログインユーザーでもアクセスできてしまう。

対処方法

ルーティングでmiddleware('auth') を使用。

Route::get('/hoge', 'FugaController@hoge')->name('fuga.hoge')->middleware('auth');

こうすれば、非ログインユーザーがexample.com/hogeを直接入力すると自動でログイン画面へ遷移する。
ログインが完了すると自動でexample.com/hogeへ遷移する。

ケース2:特定のログインユーザー用のページを他のログインユーザーに見られたくない

状況

会員Bさんのマイページ「マイページB(hoge.com/users/ユーザーID)」があるとする。
マイページBは、非ログインユーザーにも、Bさん以外のログインユーザーにもには見られたくない。

ページの構成にもよるが、
マイページBへのリンクを@if( Auth::id() == $user->id )@endifで囲むなどして
Bさん以外にはボタンが表示されないようにすることはblade上の記述で可能。
(該当ページにユーザーモデルのインスタンス$userを渡している前提です。)
そしてケース1のようにmiddleware('auth') を使えば
非ログインユーザーが直接アドレスを入力した場合への対処もできる。

しかし、別のログインユーザーが直接アドレス(hoge.com/users/ユーザーID)を入力した場合は表示ができてしまう。

対処方法

下記の1か2の対処方法が考えられる。

1. Laravelの認可機能(PolicyやGate)を使用する。

参考サイト様↓

2. 編集画面を表示させるためのコントローラー内にユーザー照合の処理を記述する。
web.php
Route::get('users/{user}', 'UserController@edit');
UserController
public function edit(User $user)
    {
         if (Auth::id() != $user->id) {
            return abort('404', 'not found');
        }else{
            return view('users.edit', [
            'user' => $user,
            ]);
        }
    }

小規模サイトであればどちらを使っても問題なさそう。
中規模以上のサイトなら認可はまとめて管理したほうが保守や運用上において好ましいので
PolicyやGate、もしくはそれに代わるオリジナルのクラス等を使ったほうがいいかもしれない。

0
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?