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() が認証が行われます。
Route::filter('auth', function () { if (Auth::guest()) { return Redirect::guest('login'); } });
Auth::guest() はファサードクラスで、実体は\Illuminate\Auth\Guard::guest()
です。check()
メソッドが呼ばれており、さらにその中でuser()
メソッドが呼ばれます。
public function guest() { return ! $this->check(); }
user()
メソッドが、認証の中核になります。前半では、セッションからログインユーザ情報を取得しています。もしセッションにユーザ情報が無ければ、後半でオートログイン処理を行います。
user()
メソッドは、Authフィルタを呼べば、常に実行されるので、アプリケーションでオートログインを利用しているか否かに関わらず、オートログイン処理が実行されることが分かります。(セッションにログインユーザ情報が無く、オートログインクッキーの値があれば常に実行される)
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
日本では、まだ知っている人が使っているという感じですが、コミュニティとしての動きも出てきて、今後は盛り上がっていきそうですね。