Help us understand the problem. What is going on with this article?

Laravelマルチ認証でセッション用テーブル、設定を分ける(Laravel6で確認済み)

More than 1 year has passed since last update.

Laravelのマルチ認証で、デフォルトのユーザ認証と管理画面用認証を実装したとします。
マルチ認証自体の実装については他の方がたくさん書いております。

セッションに関する設定、例えば

  • セッションIDを保存するときのクッキー名称
  • セッションを保存するテーブル名称
  • セッションのlifetime

などは
config/session.php
にまとめて記載されており、1つしか設定をかけません。

管理画面のセッション有効期限は変えたい、セッションテーブルは分けたい・・
などの要件もあると思います。

ここではデフォルトのユーザ認証と追加で実装した管理画面用認証が別々のセッションテーブルを利用するようにしてみます。

環境

Laravel6.0.0
MySQL5.7
XAMPP7.2.17

方針

管理用のURLパターン
/admin~
の場合だけ、セッションの設定を上書きして実行する

手順

上書きするConfig設定内容

  1. session.cookie (セッションIDを保管するクッキー名称)
  2. session.table (セッション情報が格納されるテーブル名称)

.envへ設定値の追加

環境毎に設定するもなので、まずは.envファイルに設定したい値を定義していきます。

.env
SESSION_COOKIE_ADMIN=auth-admin
SESSION_TABLE_ADMIN=sessions_admin

configファイルへの追記

configディレクトリに何でもよいので自分の設定用としてphpファイルを作成します。
config/const.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()メソッドに以下を追記する

app\Providers\AppServiceProvider.php
    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を返すからです。

参考

https://qiita.com/PKunito/items/a8300db38ce7d6949106

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away