laravel 12 custom auth guard + tables
Mon Jun 9 05:36:39 AM WIB 2025
di sini saya coba untuk membuat Auth::attempt https://laravel.com/docs/12.x/authentication#authenticating-users, tapi bedanya, ia pakai totally different table. jadi tidak pakai table users
setup model
untuk setup nya, kita buat model dulu seperti biasa pakai php artisan make:model Xyz
, disini saya buatnya php artisan make:model GuestUser
. lalu cek bagian ./app/Models/GuestUser.php
normalnya class akan extends ke Illuminate\Database\Eloquent\Model
, nah ini kita extends kan ke Illuminate\Foundation\Auth\User
, dimana class itu kalau dirunut lagi, pasti juga nge-extends ke class Model
bukti
class User extends Model implements
AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail;
}
ok, sudah. saatnya kita pindah ke model yang baru saja dibuat, isi $fillable seperti column database, jangan lupa ganti extends nya dengan extends Authenticatable
hasil akhir seperti ini kira2
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
class GuestUser extends Authenticatable
{
protected $table = "guest_user";
protected $fillable = [
'name',
'picture',
'email',
'password',
'token',
'g_auth_expires_in'
];
}
registering guard
agar model kita bisa dibaca oleh Auth
facade, maka kita harus registerkan dia dahulu di ./config/auth.php
, isi dahulu bagian providers
. contoh
/*
|--------------------------------------------------------------------------
| User Providers
|--------------------------------------------------------------------------
|
| All authentication guards have a user provider, which defines how the
| users are actually retrieved out of your database or other storage
| system used by the application. Typically, Eloquent is utilized.
|
| If you have multiple user tables or models you may configure multiple
| providers to represent the model / table. These providers may then
| be assigned to any extra authentication guards you have defined.
|
| Supported: "database", "eloquent"
|
*/
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => env('AUTH_MODEL', App\Models\User::class),
],
'guest_users' => [
'driver' => 'eloquent',
'model' => env('AUTH_MODEL', App\Models\GuestUser::class),
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
make sense kan? guest_users
provider, ia memiliki model App\Models\GuestUser::class (note, ::class
akan return str),
setelah itu, lihat bagian atasnya, ada guards, disini kita akan naming guardsnya dan juga memberi info provider model mana yang akan dikasih, contoh
/*
|--------------------------------------------------------------------------
| Authentication Guards
|--------------------------------------------------------------------------
|
| Next, you may define every authentication guard for your application.
| Of course, a great default configuration has been defined for you
| which utilizes session storage plus the Eloquent user provider.
|
| All authentication guards have a user provider, which defines how the
| users are actually retrieved out of your database or other storage
| system used by the application. Typically, Eloquent is utilized.
|
| Supported: "session"
|
*/
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'guest' => [
'driver' => 'session',
'provider' => 'guest_users',
],
],
JFYI: Auth::attempt()
secara default pakai guards web
, nah kita sekarang juga bisa pakai custom, seperti ini Auth::guard("guest")->attempt()
secara explicit kita tell laravel untuk pakai guard guest
session
general login flow
if (Auth::guard("guest")->attempt($packed_arr)) {
$retq = GuestUser::where("email", $packed_arr["email"])->first();
$retq = Auth::guard("guest")->login($retq);
return redirect('/dashboard/index');
} else {
dd("login failed");
}
Auth::guard("guest")->attempt()
return boolean, true jika auth benar. Auth::guard("guest")->login($retq);
ubah state internalnya bahwa dia sudah login, lalu redirect (penting, jika tidak diredirect, nanti session akan stuck)