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
日本では、まだ知っている人が使っているという感じですが、コミュニティとしての動きも出てきて、今後は盛り上がっていきそうですね。

