こんにちは、さるまりんです。
Webサイト上でログインしないとアクセスできないエリアがあります。この中のURLに未ログイン状態でアクセスされた時にまずログインさせてから、元々行きたかったURLにリダイレクトしたい時があります。
今回はそれをLaravel上でやっていますので残しておきます。
標準の認証で使われるauth
ミドルウェアを使って実現しています。
1. Authenticatedミドルウェア
Authenticated
ミドルウェアのredirectTo()
メソッドで、ログインしていなければ指定されたURL(アクセスしたいURL)をセッションにとっておきます。
こんなコードです。
class Authenticate extends Middleware
{
// いろいろあって...
// ここです
protected function redirectTo($request)
{
$uri = $request->getUri();
if (! $request->expectsJson()) {
// セッションにリクエストURLを保存
session()->put('url.intended', url()->current());
return route('login');
}
}
}
2. LoginControllerコントローラー
セッションからリクエストされたURLがあればそこにリダイレクトします。
protected function authenticated(Request $request, $user)
{
// セッションからリダイレクト先URLを取得
$redirectUrl = session()->pull('url.intended', '/');
return redirect()->intended($redirectUrl); // 認証後にリダイレクト
}
3. ルートの設定
ルートで認証で保護するURLにauth
ミドルウェアを指定する。
いろいろ書き方はあると思いますが↓のような感じです。
Route::get('/mypage', 'MypageController@index')->name('mypage')->middleware('auth');
MyPageController
のindex()
でアクセスされる/mypage
(マイページ)は認証後でないと表示できないようにしています。
4. RedirectIfAuthenticatedミドルウェア
これはいるかどうかですが、ログインしている状態でログイン画面にアクセスした時はトップにリダイレクトするようにもしています。
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('home'); // リダイレクト先をトップページに設定
}
return $next($request);
}
他にもいろいろやり方があるんでしょうね。ケースにあった実装ができるように知識を増やしたいです。
読んでくださってありがとうございました。
それではまた!