I’m building a site where I have two different users, the backend user which is laravel’s default and frontend user for members and they have their own member area. The default user is from users table and members are from member table. Each has their own guards.
When user, which has web guard, is doing login, logout, or other things, laravel will store/update data in sessions table. The problem is, member guard also stored in the same table and I don’t want that because there might be same ID between user and member stored in there. Furthermore, I also want to use UUID for member’s ID, so it won’t match with sessions table which has BIGINT data type. That’s why I would like to have other sessions table which called sessions_member table to store member’s session data.
config/auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'member' => [
'driver' => 'session_member',
'provider' => 'members',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => env('AUTH_MODEL', AppModelsUser::class),
],
'members' => [
'driver' => 'eloquent',
'model' => AppModelsMember::class,
],
],
session_member is a copy of config/session.php except some changes on table (sessions_table) and cookie:
<?php
use IlluminateSupportStr;
return [
'driver' => env('SESSION_DRIVER', 'database'),
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
'encrypt' => env('SESSION_ENCRYPT', false),
'files' => storage_path('framework/sessions'),
'connection' => env('SESSION_CONNECTION'),
'table' => env('SESSION_TABLE', 'sessions_member'),
'store' => env('SESSION_STORE'),
'lottery' => [2, 100],
'cookie' => env(
'SESSION_MEMBER_COOKIE',
Str::slug(env('APP_NAME', 'member'), '_').'_session'
),
'path' => env('SESSION_PATH', '/'),
'domain' => env('SESSION_DOMAIN'),
'secure' => env('SESSION_SECURE_COOKIE'),
'http_only' => env('SESSION_HTTP_ONLY', true),
'same_site' => env('SESSION_SAME_SITE', 'lax'),
'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
];
This is sessions_member table structure:
Schema::create('sessions_member', function (Blueprint $table) {
$table->string('id')->primary();
$table->string('member_id');
$table->foreign('member_id')->references('id')->on('tbl_member');
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->longText('payload');
$table->integer('last_activity')->index();
});
And here’s my route:
Route::prefix('member')->group(function(){
Route::middleware('guest:member')->group(function(){
Route::get('/login', [MemberController::class, 'login'])->name('member.login');
Route::post('/login', [MemberController::class, 'loginprocess'])->name('member.loginprocess');
Route::get('/register', [MemberController::class, 'register'])->name('member.register');
});
Route::middleware('auth:member')->group(function(){
Route::get('/dashboard', [MemberController::class, 'index'])->name('member.dashboard');
Route::get('/logout', [MemberController::class, 'logout'])->name('member.logout');
});
});
Route::prefix('admin')->group(function(){
Route::get('/login', [LoginController::class, 'index'])->name('login');
Route::post('/login', [LoginController::class, 'login']);
Route::middleware('auth:web')->group(function(){
Route::get('', [LoginController::class, 'index']);
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
});
When I access member/dashboard or member/login, I got an error:
Auth driver [session_member] for guard [member] is not defined.
Is there aynthing else that needs to be done? It’s been days and I still haven’t found solutions. Please help.