Authフィルタによるオートログインについてです。
「ひとり Laravel Japan ツアー 2014」と称して、Laravel 福岡 と Laravel Meetup Tokyo vol.3 に参加してきました。
どちらでも発表を行ったのですが、ここでは、Laravel Meetup Tokyo で発表した Auth オートログインの資料を公開します。
知っておくべきAuthオートログイン
Laravel では Auth という認証を行う機能があるのですが、標準でオートログイン機能が実装されています。
Login::attempt() というログイン処理を行うメソッドの第二引数にtrue
を渡すだけで、オートログイン用のクッキーが発行され、もしログインセッションが切れても、自動でオートログインが行われます。
とても簡単に使えるのは良いのですが、暗号化したクッキーでのみ認証を行うので、利用には注意が必要です。
詳細は資料を確認してみてください。
私は、オートログイン処理を自作して、カスタムドライバとして組み込むことで対応しています。
Laravel でカスタムドライバを使って Remember Me(オートログイン)を実装する
Auth フィルタによるオートログイン
このオートログインは、Auth フィルタを使っていると常に有効となっているので、アプリケーションでオートログインを使っているか否かに関わらず、影響があります。
該当のコードは以下です。
まず、Auth フィルタの定義です。app/filters.php で定義されており、Auth::guest() が認証が行われます。
1 2 3 4 5 | Route::filter( 'auth' , function () { if (Auth::guest()) { return Redirect::guest( 'login' ); } }); |
Auth::guest() はファサードクラスで、実体は\Illuminate\Auth\Guard::guest()
です。check()
メソッドが呼ばれており、さらにその中でuser()
メソッドが呼ばれます。
1 2 3 4 | public function guest() { return ! $this ->check(); } |
user()
メソッドが、認証の中核になります。前半では、セッションからログインユーザ情報を取得しています。もしセッションにユーザ情報が無ければ、後半でオートログイン処理を行います。
user()
メソッドは、Authフィルタを呼べば、常に実行されるので、アプリケーションでオートログインを利用しているか否かに関わらず、オートログイン処理が実行されることが分かります。(セッションにログインユーザ情報が無く、オートログインクッキーの値があれば常に実行される)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public function user() { if ( $this ->loggedOut) return ; if ( ! is_null ( $this ->user)) { return $this ->user; } $id = $this ->session->get( $this ->getName()); $user = null; if ( ! is_null ( $id )) { $user = $this ->provider->retrieveByID( $id ); } $recaller = $this ->getRecaller(); // <--- オートログインクッキー値取得 if ( is_null ( $user ) && ! is_null ( $recaller )) { $user = $this ->getUserByRecaller( $recaller ); // <--- オートログイン処理 } return $this ->user = $user ; } |
さいごに
このオートログイン仕様を受け入れるかどうかは使う人次第ですが、その場合、暗号鍵( app/config/app.php の key )は絶対に漏洩しないように扱う必要があります。
なお、Laravel ツアーは、福岡(+大分)と東京の Laravel ユーザと色々なアツい話ができて楽しかったです:D
日本では、まだ知っている人が使っているという感じですが、コミュニティとしての動きも出てきて、今後は盛り上がっていきそうですね。