こんにちは、コバヤシです。 久しぶりの更新ですね。
以前、PHPフレームワーク比較を書いて早2年半。
弊社のメインのPHPフレームワークはFuelPHPからLaravelに変わりました。
FuelPHPも嫌いではなかったのですが、僕的にはLaravelの方が扱いやすいですね。
積極的にプロジェクトで使用していきたいと思っています。
さて、そんなLaravelの案件でログイン認証のremember meの期間を変更する必要が出てきました。
「remember me」というのは、ログイン時にチェックすると、次回以降ID・PASSを入力しなくてもログインを維持するという機能です。
Laravelではこの期間が5年となっているので、これを変更したい!
最初は設定があるだろうから、それを変えれば・・・と簡単に考えていたのですが、この期間ってハードコーディングされているんですね。
該当箇所はこちら。
/vendor/laravel/framework/src/Illuminate/Cookie/CookieJar.php
85行目あたり
<?php /** * Create a cookie that lasts "forever" (five years). * * @param string $name * @param string $value * @param string $path * @param string $domain * @param bool $secure * @param bool $httpOnly * @param bool $raw * @param string|null $sameSite * @return \Symfony\Component\HttpFoundation\Cookie */ public function forever($name, $value, $path = null, $domain = null, $secure = false, $httpOnly = true, $raw = false, $sameSite = null) { return $this->make($name, $value, 2628000, $path, $domain, $secure, $httpOnly, $raw, $sameSite); }
Authではなくて、Cookie内に2628000(5年x365日x24時間x60分)と記述されています。
5年は永久(forever)なのか!というツッコミはおいておいて、何とか期間を変更しなければなりません。
調べてみると、こちらのサイトが参考になりそう。
ログイン処理の中で、Cookieを書き換えているようですね。
実装
という事で、こんな感じで実装してみました。
/app/Http/Controllers/Auth/LoginController.php
<?php protected function sendLoginResponse(Request $request) { $request->session()->regenerate(); $this->clearLoginAttempts($request); $cookies = \Auth::getCookieJar(); $value = $cookies->queued(\Auth::getRecallerName())->getValue(); $cookies->queue(\Auth::getRecallerName(), config('auth.remember_me_expiration')); return $this->authenticated($request, $this->guard()->user()) ?: redirect()->intended($this->redirectPath()); }
LoginControllerクラスのsendLoginResponseをオーバーライドして
一度登録されたremember me トークンを期間を変更して再登録します。
期間はconfigで設定するので自由に変えることが出来ます。
何となく少し遠回りですが、 これで目的を達成することが出来ました。
まとめ
思ったよりも、このあたりの情報がなくて参考サイトが見つかるまで苦労しました。
remember meの期間を変更したいという需要は少ないんでしょうかね。。
もっと華麗に解決出来るようにしていきたいところです。