Laravel 5.7 でログインユーザのみ投稿ページにアクセスできるようにする方法
先日のnoteでは、Laravelで投稿機能を作成しました。
現在はログインしていようがしていまいが投稿フォームにアクセスできるようになっていますが、今回はログインしているユーザのみ投稿フォームにアクセスできるように設定します。
今回やること
・投稿フォームページに認証機能をつけ、ログインしていない場合はログインフォームにリダイレクトさせる
前提
・Laravelが動く環境がすでにあること
・すでに投稿フォームが作成されていること
・Laravel のバージョンは5.7
完成動画はこちらです。
それでは始めます。
--- 🖥 ---
実装の前に、ミドルウェアとは
それでは投稿フォームにアクセスするにはログイン認証を求める実装を行います。
ログインしないと投稿フォームにアクセス出来ないようにします。
ページ認証を実行する処理は、ミドルウェアを利用します。ミドルウェアとは何か...?と言われるととても難しいしまだまだ理解しきれていないのが正直なところなのですが、とても簡単に言うとユーザがアプリケーションを実行するときに、そのアプリケーションが実行される前に行われる処理を言うようです。
今回でいうと、
1. ユーザ:投稿フォームへアクセス
↓
2. アプリケーション:投稿ページを表示する
という動作ですが、ミドルウェアを利用することによって
1. ユーザ:投稿フォームへアクセス
↓
2.ミドルウェア:ユーザがログインしているかどうか確認する
↓
3-1. アプリケーション:投稿ページを表示する
or
3-2. アプリケーション:ログインフォームを表示する
というように、ユーザとアプリケーションの間に処理を挟むことができます。
このミドルウェアですが、デフォルトで用意されているのでこちらを利用します。
ルーティングの修正
それでは対応していきます。routes/web.php を下記のように修正します。
//投稿フォームページ
Route::group(['middleware' => 'auth'], function() {
Route::get('/post', 'PostController@showCreateForm')->name('posts.create');
Route::post('/post', 'PostController@create');
});
■↑のポイント
・「Route::group(['middleware' => 'auth'], function() { });」 で投稿フォームを囲みます。
・「'middleware' => 'auth'」と指定しています。
(app/Http/Kernel.php というファイルに「auth」の定義が記載されています)
このauthというミドルウェアは、ユーザがログインしているかどうかを確認できるミドルウェアです。
ログインしている場合はルーティングで指定したコントローラー(今回だとPostController)を実行し、
ログインしていない場合はログインページ(/login)へリダイレクトされるようになります。
こちらの対応で、ログインしていない状態で投稿フォームにアクセスすると、ログインページへリダイレクトされます。
(リダイレクトされたログインフォームよりログインすると投稿フォームが表示されます。)
ログイン時のログインページ、会員登録ページの表示について
ここまででログインしていない場合の認証処理について完了しました。
逆にログインしているユーザに見せたくないページもあります。
「ログイン画面」「ユーザ登録画面」等はログインしているユーザに見せる必要はありません。
こちらについてはすでに対応されています。実際にログインした状態でログインページ(/login)や会員登録ページ(/register)にアクセスすると、「/home」にリダイレクトされます。
これは、「app/Http/Controllers/Auth/LoginController.php」や「app/Http/Controllers/Auth/RegisterController.php」ですでに定義されています。
※LoginController.phpの例
public function __construct()
{
$this->middleware('guest')->except('logout');
}
ここのguestという定義は、「app/Http/Kernel.php」にて定義されています。
※Kernel.php一部抜粋
protected $routeMiddleware = [
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];
RedirectIfAuthenticatedを定義しているので、「app/Http/Middleware/RedirectIfAuthenticated.php」というファイルを確認します。(下記部分です。)
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/home');
}
return $next($request);
}
「return redirect('/home');」ということで「/home」が指定されています。他のページを指定したい場合は、ここのhomeの部分を修正してください。
ということでまとめますと、
デフォルトではログインしているユーザがログインフォームにアクセスした場合、「/home」にリダイレクトするように設定されています。
以上で対応完了です。お疲れ様でした。
--- 🖥 ---
GitHubリポジトリ
今回作成したソースはGithubにて公開しています。下記リンクよりご確認ください。(lerning-5ブランチです。)
https://github.com/KoushiKagawa/laravel-learning/tree/learning-5
間違いや、もっとこう書いた方が良いよ!といったご指摘はコメント欄かtwitterのDMいただけると喜びます!
読んでいただきありがとうございます。