Laravelのマルチ認証で、デフォルトのユーザ認証と管理画面用認証を実装したとします。
マルチ認証自体の実装については他の方がたくさん書いております。
セッションに関する設定、例えば
- セッションIDを保存するときのクッキー名称
- セッションを保存するテーブル名称
- セッションのlifetime
などは
config/session.php
にまとめて記載されており、1つしか設定をかけません。
管理画面のセッション有効期限は変えたい、セッションテーブルは分けたい・・
などの要件もあると思います。
ここではデフォルトのユーザ認証と追加で実装した管理画面用認証が別々のセッションテーブルを利用するようにしてみます。
環境
Laravel6.0.0
MySQL5.7
XAMPP7.2.17
方針
管理用のURLパターン
/admin~
の場合だけ、セッションの設定を上書きして実行する
手順
上書きするConfig設定内容
- session.cookie (セッションIDを保管するクッキー名称)
- session.table (セッション情報が格納されるテーブル名称)
.envへ設定値の追加
環境毎に設定するもなので、まずは.envファイルに設定したい値を定義していきます。
SESSION_COOKIE_ADMIN=auth-admin
SESSION_TABLE_ADMIN=sessions_admin
configファイルへの追記
configディレクトリに何でもよいので自分の設定用としてphpファイルを作成します。
config/const.php
return[
// 管理画面用のクッキー名称、セッションテーブル名
'session_cookie_admin' => env('SESSION_COOKIE_ADMIN', Str::slug(env('APP_NAME', 'laravel'), '_').'_session'),
'ssession_table_admin' => env('SESSION_TABLE_ADMIN'),
]
設定ファイルをキャッシュ
私の場合、設定ファイルを変更した場合は必ずキャッシュしているので今回もキャッシュしておきます。
php artisan config:cache
これで設定値の定義自体は完了しました。次は具体的にどのように設定を上書きしていくかです。
設定を上書きする
修正対象ファイルは
app\Providers\AppServiceProvider.php
boot()メソッドに以下を追記する
public function boot()
{
// 管理画面用のクッキー名称、セッションテーブル名を変更する
$uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
if (strpos($uri, '/admin/') === 0 || $uri === '/admin') {
config([
'session.cookie' => config('const.session_cookie_admin'),
'session.table' => config('const.ssession_table_admin'),
]);
}
}
これで/admin以下へのアクセス時にセッションを利用する場合には上書きした設定値が採用されるはずです。
ポイント
- session.phpについて
- config/session.phpの中にif文を書ければ早いが・・。config:cacheで設定をキャッシュするとこのif文は実行されない。
- (厳密にいうとconfig:chaceを実行した瞬間だけ実行される。意味なし)
- なので、この設定ファイルに書くのは得策ではなさそう。
- 上書きを実行する場所について
- コントローラ側での上書きでは順番的に遅いのでapp\Providers\AppServiceProvider.phpで始めに上書きしました。
- 設定値の読み出しにはenv関数ではなく、config関数を使います。設定をキャッシュしている場合、env関数はnullを返すからです。
参考