DEV Community

Cover image for Create multi auth guard on laravel with custom table
Muhammad Eko Pujianto
Muhammad Eko Pujianto

Posted on

Create multi auth guard on laravel with custom table

Membuat multi auth guard pada laravel dengan custom table.

Umumnya kita develop aplikasi laravel menggunakan starter kit bawaan laravel untuk proses login dan register. Ada laravel/ui, laravel/breeze, dan masih banyak lainnya. Namun bawaan starter kit ini defaultnya ke table users , lantas gimana kalau kita pengen ke table yang lainnya?

Oke tutorial berikut akan menjelaskan gimana cara auth dengan guard dan table custom:

pada tutorial ini saya akan membuat auth admin dari table admins di database.


1. Buat Database dulu

pertama silahkan buat databse admin dulu, kita bisa menggunakan perintah berikut:

php artisan make:migration create_admins_table
Enter fullscreen mode Exit fullscreen mode

create_admins_table


2. Setup auth.php

pergi ke config/auth.php , tambahkan sedikit kode untuk mendukung proses auth dengan guard admin

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        // Tambahkan yang ini 👇
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
    ],
Enter fullscreen mode Exit fullscreen mode
'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
        // Tambahkan yang ini 👇
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ],
    ],
Enter fullscreen mode Exit fullscreen mode
'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
        // Tambahkan yang ini 👇
        'admins' => [
            'provider' => 'admins',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],
Enter fullscreen mode Exit fullscreen mode

3. Model Admin

Siapkan model untuk admin, model di Laravel menggambarkan sebagai objek nyata dalam konsep OOP. Di sini model admin.php merepresentatifkan table admins di database.

buat model melalui perintah:

php artisan make:model Admin
Enter fullscreen mode Exit fullscreen mode

sedikit edit kodenya jadi seperti ini:

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User; //penting untuk authnya
use Illuminate\Notifications\Notifiable;

class Admin extends User
{
    use HasFactory, Notifiable;
    protected $fillable = [
        'name',
        'email',
        'password',
    ];
    protected $hidden = [
        'password',
        'remember_token',
    ];
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}
Enter fullscreen mode Exit fullscreen mode

Dalam konsep auth manual laravel yang terpenting adalah import class User bawaan sistem laravel.

use Illuminate\Foundation\Auth\User;
Enter fullscreen mode Exit fullscreen mode

4. Siapkan Controller Auth untuk Admin

Database, Model, Config sudah oke tinggal Controllernya. Silahkan buat controller dengan perintah:

php artisan make:controller Admin/AdminController
Enter fullscreen mode Exit fullscreen mode

di sini saya bikin Admin/AdminController agar dibuatkan folder controller tersendiri oleh laravel

sedikit catatan untuk membuat manual auth di laravel, maka disarankan harus import Auth dari Facades. Ini sesuai dokumentasi official dari laravel.com

dokumentasi asli laravel

Oke lanjut untuk edit AdminController kita menjadi seperti ini:

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    use AuthenticatesUsers;

    public function __construct()
    {
        $this->middleware('guest:admin')->except('logout');
    }

    public function showLoginForm()
    {
        return view('admin.auth.login');
    }

    public function login(Request $request)
    {
        $this->validate($request, [
            'email' => 'required|email',
            'password' => 'required',
        ]);
        // return 'success';
        $credentials = [
            'email' => $request->email,
            'password' => $request->password
        ];
        if ($this->guard()->attempt($credentials, $request->has('remember'))) {
            $request->session()->regenerate();
            return redirect()->intended('admin');
        }
        return back()->withErrors([
            'email' => 'The provided credentials do not match our records.',
        ])->onlyInput('email');
    }

    /**
     * Get the guard to be used during authentication.
     *
     * @return \Illuminate\Contracts\Auth\StatefulGuard
     */
    protected function guard()
    {
        return Auth::guard('admin');
    }
}

Enter fullscreen mode Exit fullscreen mode

Yang menjadi perhatian teman-teman adalah guard nya guard('admin') bukan guard() biasa. Ini tanda untuk laravel bahwa yang digunakan untuk proses login adalah guard admin dimana menggunakan table admins


Finnaly

Untuk setup core nya udah selesai, sisanya tinggal pemanggilan route dan views yang disiapkan untuk controller tadi.

Silahkan mencoba!
🙏

Top comments (1)

Collapse
 
bagusrizkita profile image
bagusrizkita

Masuk Pak Eko.
Sudah aku like. Semoga naik gaji :D