環境: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. 編集画面を表示させるためのコントローラー内にユーザー照合の処理を記述する。
Route::get('users/{user}', 'UserController@edit');
public function edit(User $user)
{
if (Auth::id() != $user->id) {
return abort('404', 'not found');
}else{
return view('users.edit', [
'user' => $user,
]);
}
}
小規模サイトであればどちらを使っても問題なさそう。
中規模以上のサイトなら認可はまとめて管理したほうが保守や運用上において好ましいので
PolicyやGate、もしくはそれに代わるオリジナルのクラス等を使ったほうがいいかもしれない。