どうもこんにちは
毎度のごとく、Laravelの話題です。
Laravelで、フロント機能と管理機能を作って、別々の認証機構を持ちたいときありますよね。
例えば、フロントはLaravelの認証機能(php artisan make:auth
で作るアレ)で、
管理画面はLaravel-adminで、とすると、同一セッションの奪い合いになるようで。
私のところでは、Laravel-adminでログインしたまま、フロント側のログインを行うと419が出ました。
VerifyCsrfTokenからthrowされる、TokenMismatchExceptionです。はい。
これを回避するために、設定を加えます。
なお、バージョンは
Laravel 5.8
encore/laravel-admin 1.6.10
です。
↓↓↓今回の記事は、こちらを参考にさせていただきました。↓↓↓
Laravel 5.6 で multi-auth の実装 | CORGI, Inc.
前提
一応、ですが。
Laravel本体とlaravel-adminはcomposer経由でインストール済み。
そのあと、フロント側の認証機能を作成
php artisan make:auth
および、laravel-adminのドキュメントにしたがって、
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
と
php artisan admin:install
は済ませておきます。
ここ以降、ほぼインストールした直後の状態で話を進めます。
もし、必要であれば適宜読み替えてください。
セッションを分離する
いきなり本題です。
URLによって、セッションIDを持たせるキーを変えます。
■.env
下記を追記します。
1 2 |
SESSION_COOKIE = front SESSION_COOKIE_ADMIN = admin |
■config/session.php
まず、初期状態では配列をreturnしているだけなので、返却する変数に収めます。
で、管理画面のURL(変更していなければ、管理画面のURLはadminから始まる)からのアクセスであれば
cookieのキーを変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php use Illuminate\Support\Str; $configure = [ // <- もともと、"return [...];"だった // 中略 ]; // 管理画面のセッションクッキーを変更する $uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; if (strpos($uri, '/admin/') === 0 || $uri === '/admin') { // <- 管理画面のURLかどうかを判定 $configure['cookie'] = env( 'SESSION_COOKIE_ADMIN', Str::slug(env('APP_NAME', 'laravel'), '_').'_admin_session' ); } return $configure; // 再定義した設定を返す |
■おまじない
php artisan config:cache
これでほぼおしまいです。
ログアウト処理
デフォルトのままのログアウト処理は、フロント側、管理画面(laravel-admin)側ともに
$request->session()->invalidate();
があります。
これをすると、セッションを全部消してしまうので、
$request->session()->invalidate();
を抜いた処理にして、ログアウト処理をオーバーライドします。
※セッション消去上等!の場合は下は不要です。
■フロント側(app\Http\Controllers\Auth\LoginController.php)
1 2 3 4 5 |
public function logout(Request $request) { $this->guard()->logout(); return $this->loggedOut($request) ?: redirect('/'); } |
■管理画面側(app\Admin\Controllers\AuthController.php)
1 2 3 4 5 |
public function getLogout(Request $request) { $this->guard()->logout(); return redirect(config('admin.route.prefix')); } |
これでうまいこといきました。
r.tanakaがお届けしました。