Tanggal :11 September 2024
Membuat Multi Auth di Laravel 7

Membuat Fitur Multi Auth di Laravel 7

Assalamualaikum Warohmatulloh Wabarokatuh, seringkali saya dapat pertanyaan tentang cara membuat multi auth Laravel. Mungkin tepat rasanya jika dituliskan dalam sebuah artikel, agar mudah menjawabnya dan lebih banyak yang bisa belajar.

Tutorial ini harusnya bisa juga digunakan untuk Laravel versi 5.5, 5.6, 5.7, 5.8 dan 6. Karena tidak banyak perubahan pada struktur autentikasi pada versi tersebut.

Menginstal Laravel

Pertama kita buat sebuah projek baru Laravel tentunya, bisa gunakan perintah composer create-project.

composer create-project --prefer-dist laravel/laravel multi-auth

Atau menggunakan Laravel Installer.

laravel new multi-auth

Menginstal Laravel UI

Karena sejak Laravel 6 perintah make:auth sudah tidak ada, maka kita harus menginstal package laravel/ui untuk membuat auth scaffold. Jika kawan kawan menggunakan versi sebelum versi 6, lewati langkah ini.

composer require laravel/ui

Setelah terinstal jalankan perintah untuk membuat auth scaffoldingnya, kali ini saya gunakan saja Bootstrap.

php artisan ui bootstrap --auth

Dan setelahnya jangan lupa untuk menjalankan perintah untuk compile asetnya.

npm install && npm run dev

Tunggu sampai proses instal dan build selesai.

Konfigurasi Database

Selanjutnya buat sebuah database dengan nama sesuai keinginan kawan-kawan, kali ini saya akan namakan multi-auth. Berikutnya sesuaikan konfigurasi pada file .env.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=multi-auth
DB_USERNAME=root
DB_PASSWORD=

Membuat Migration

Karena kita akan membuat multi auth tentunya kita akan membutuhkan sebuah tabel baru, misalnya kita akan buat tabel ‘admins‘ untuk user dengan jabatan admin.

Buat migration baru dengan perintah di bawah ini.

php artisan make:migration create_admins_table

Kemudian akan muncul file migration baru, saatnya kita sesuaikan migrationnya punya saya 2020_04_07_180057_create_admins_table.php, nah coba dicari punya kawan-kawan. Lalu masukkan saja kode di bawah ini, yang sama persis dengan migration dari users.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateAdminsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('admins');
    }
}

Begitu selesai, langsung tancap gas jalankan php artisan migrate untuk melakukan migrasi tabel.

Membuat Model Admin

Berikutnya buat model dengan nama Admin dengan artisan.

php artisan make:model Admin

Setelah model terbuat, lakukan perubahan kode di file model Admin menjadi sebagai berikut.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticable;
use Illuminate\Notifications\Notifiable;

class Admin extends Authenticable
{
    use Notifiable;

    protected $guard = 'admin';

    protected $fillable = [
        'name', 'email', 'username', 'password','email_verfied_at'
    ];

    protected $hidden = ['password'];
}

Pada model Admin kita lihat ada $guard = 'admin'. Itu yang akan kita sesuaikan pada file config/auth.php. Buat sebuah guard baru dengan menambahkan kode ke dalam array guards.

 'guards' => [
        ....
        'admin' => [
           'driver' => 'session',
           'provider' => 'admins',
        ],
    ],

Berikutnya, pada bagian providers, definisikan provider baru untuk guard admin, dimana untuk driver kita gunakan eloquent dan untuk model kita gunakan model Admin.

'providers' => [
        ...

        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
    ],

Mendefinisikan Route Login Admin

Buat dua route baru untuk login admin.

Route::get('admin/login', 'Auth\AdminAuthController@getLogin')->name('admin.login');
Route::post('admin/login', 'Auth\AdminAuthController@postLogin');

Membuat Controller Untuk Fungsi Auth Admin

Buat sebuah controller untuk mengangani autentikasi admin di dalam folder Auth atau bebas terserah kawan mau ditaruh dimana. Disini sebagai contoh agar jadi satu dengan controller auth lainnya saya buat di dalam folder Auth.

php artisan make:controller Auth/AdminAuthController

Kemudian tulis kode di bawah ini ke class AdminAuthController.

<?php

namespace App\Http\Controllers\Auth;

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

class AdminAuthController extends Controller
{
    use AuthenticatesUsers;

    protected $maxAttempts = 3;
    protected $decayMinutes = 2;

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

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

    public function postLogin(Request $request)
    {
        $this->validate($request, [
            'email' => 'required|email',
            'password' => 'required|min:5'
        ]);

        if (auth()->guard('admin')->attempt($request->only('email', 'password'))) {
            $request->session()->regenerate();
            $this->clearLoginAttempts($request);
            return redirect()->intended();
        } else {
            $this->incrementLoginAttempts($request);

            return redirect()
                ->back()
                ->withInput()
                ->withErrors(["Incorrect user login details!"]);
        }
    }

    public function postLogout()
    {
        auth()->guard('admin')->logout();
        session()->flush();

        return redirect()->route('admin.login');
    }
}

Membuat View Login Admin

Tentu agar admin bisa login, kita buatkan sebuah tampilan form login. Tampilan ini saya copy dari file resources/views/auth/login.blade.php dengan sedikit penyesuaian.

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Login Admin</div>

                <div class="card-body">
                    <form method="POST" action="">
                        @csrf

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <div class="col-md-6 offset-md-4">
                                <div class="form-check">
                                    <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>

                                    <label class="form-check-label" for="remember">
                                        {{ __('Remember Me') }}
                                    </label>
                                </div>
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-8 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Login') }}
                                </button>

                                @if (Route::has('password.request'))
                                    <a class="btn btn-link" href="{{ route('password.request') }}">
                                        {{ __('Forgot Your Password?') }}
                                    </a>
                                @endif
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Middleware Untuk Admin

Untuk melindungi halaman agar hanya bisa diakses oleh user yang sudah login dan dari guard admin. Kita bisa gunakan middleware auth dengan tambahhan guard yang digunakan, untuk guard admin maka seperti ini auth:admin.

Penulisan middleware di file route.

Route::middleware('auth:admin')->group(function(){
  // Tulis routemu di sini.
});

Penulisan middleware di controller.

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

Menangani Redirect

Untuk menangani redirect route yang menggunakan auth:admin agar diarahkan ke halaman login admin, tambahkan kode di bawah ke app/Exceptions/Handler.php.

protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        $guard = Arr::get($exception->guards(), 0);

        $route = 'login';

        if ($guard == 'admin') {
            $route = 'admin.login';
        }

        return redirect()->route($route);
    }

Jangan lupa untuk import / use Facades Array di atas deklarasi Class.

use Illuminate\Support\Arr;

Membuat User Admin

Untuk melakukan percobaan dari proses membuat multi auth di Laravel ini, kita membutuhkan user di tabel admin. Jadi, mari kita buat dengan seeder.

php artisan make:seeder AdminTableSeeder

Kemudian buat seedernya seperti ini.

<?php

use App\Admin;
use Illuminate\Database\Seeder;

class AdminTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Admin::create([
            'name' => 'admin',
            'email' => 'admin@multi-auth.test',
            'password' => bcrypt(12345678),
        ]);
    }
}

Lanjut, jalankan seedernya dengan perintah artisan ini.

php artisan db:seed --class=AdminTableSeeder

Nah sekarang kawan kawan bisa mencoba & menikmati multi auth di Laravel dengan tabel yang berbeda.

Semoga bermanfaat & bagikan ke lainnya agar manfaatnya mennyebar.

Wassalamualaikum Warohmatulloh Wabarokatuh.

Ikon Gembok dari pngtree.com

Hai semua, saya Amirul seorang Software Engineer, suka membuat konten pembelajaran berupa artikel, video tutorial maupun podcast

One Ping

  1. Pingback: Belajar Laravel Roles & Permission : membedakan level user

63 Comments

      1. Arifia Kasastra R

        Maaf Pak, coba di cek lagi file route/web.php nya, yang ditulis di atas tidak ada route dengan nama ‘login’, adanya ‘admin.login’.
        Kalo yang saya baca, harusnya ini di handle sama file handler.php, ketika route yang diakses dengan guard admin, route nya jadi ‘admin.login’, tapi dia malah masuk ke App\Http\Middleware\Authenticate.php, di file ini memang di redirect nya ke route dengan name ‘login’, sedangkan route dengan nama ‘login’ nggak ada Pak.

  1. Hilmi Hidayat

    Setelah saya taruh use Illuminate\Support\Arr; di handler.php kenapa ga bisa jalanin perintah artisan ya mas ? selalu error seperti ini

    Could not check compatibility between App\Exceptions\Handler::unauthenticat
    ed($request, App\Exceptions\AuthenticationException $exception) and Illumin
    ate\Foundation\Exceptions\Handler::unauthenticated($request, Illuminate\Aut
    h\AuthenticationException $exception), because class App\Exceptions\Authent
    icationException is not available

  2. Muhammad Ridha

    Saat admin berhasil login, kemudian saya kembali mencoba mengakses Route “admin.login” tapi diarahkan ke halaman login milik user,
    Seharusnya kan diarahkan ke home/dashboard admin?

        1. Wahidin

          yang bagian ini
          public function __construct()
          {
          $this->middleware(‘auth:admin’);
          }
          apakah ditaruh di AuthAdminController dibawahnya ini
          public function __construct()
          {
          $this->middleware(‘guest:admin’)->except(‘postLogout’);
          }
          atau bagaimaa mas?

  3. agungp

    mas boleh request tutorial gk? masih berhubungan dengan multiauth sih, jadi login nya itu tetap menggunakan table users, data dirinya ada di table lain gitu, jadi misal kalau login terus datadirinya ada di table admin masuk ke dashboard admin gitu, jadi route untuk login nya cukup /login, saya nyoba buat error terus mas

  4. kurnia

    mlm bang mau tanya,
    kalo yg ini maksudnya apa ya bang

    Route::middleware(‘auth:admin’)->group(function(){
    // Tulis routemu di sini. (route apa yg harus di tulis di sini)
    });

  5. ilham

    Route::middleware(‘auth:admin’)->group(function(){
    // Tulis routemu di sini.
    Route::get(‘admin/home’, ‘stook@index’);
    });

    bang kok udah login kan harusnya ke index
    malah masuk login lagi yah?

  6. ardiansah

    Saya menggunakan editor VScode,
    tulisan attempt saya bergaris warna merah dengan pesan kesalahan : Undefined method ‘attempt’.
    pada saat saya memasukkan code berukut di function postLogin :
    if (auth()->guard(‘admin’)->attempt($request->only(‘email’, ‘password’))) {
    $request->session()->regenerate();
    $this->clearLoginAttempts($request);
    return redirect()->intended();

    itu kira-kira karna apa ya bang?
    mohon bantuannya bang. Terima kasih sebelumnya

  7. Nuzulul

    Mas aku mau tanya, ini kan aku bikin login via api juga, kemudian ada multi login di app web nya, ini kok ada error kalau login failed di auth via api nya ya,
    errornya gini
    Too few arguments to function App\Exceptions\Handler::unauthenticated()

      1. Nuzulul

        sama ngikutin di atas, yang login web nya sih udah running well, aku nambah guard admin, tapi yang error di auth api yang pake table user, errornya karena method unauthenticated() nya habis di overide

  8. Yoni Widhi

    Saya berhasil, tapi pada saat admin berhasil login, kemudian malah di redirect ke halaman login(user biasa)nya.
    Seharusnya kan diarahkan ke home/dashboard admin?
    tapi middleware nya sudah jalan dan di tes pake Auth::user()->name udah keluar nama Admin nya.
    Pertanyaannya kenapa kalo sudah login sbg admin tetap bisa akses halaman user??

  9. I Made Hermanto

    mas kenapa setelah saya login sebagai admin muncul error seperti ini
    Argument 1 passed to Illuminate\Auth\EloquentUserProvider::validateCredentials() must be an instance of Illuminate\Contracts\Auth\Authenticatable, instance of App\Admin given, called in C:\xampp\htdocs\juaraservernew\vendor\laravel\framework\src\Illuminate\Auth\SessionGuard.php on line 385

  10. Kang Ilham

    mau tanya mas, mendapatkan masalah ini terus menerus

    Symfony\Component\ErrorHandler\Error\FatalError
    Trait ‘App\Http\Controllers\Auth\AuthenticatesUsers’ not found

    mohon bantuannya

  11. Dimas Aulia Putra

    Mas,ini sudah sesuai yang diatas,tetapi kok saat dijalankan di web ada tulisan begini

    The page isn’t redirecting properly

    Firefox has detected that the server is redirecting the request for this address in a way that will never complete.

    This problem can sometimes be caused by disabling or refusing to accept cookies.

  12. Mochammad Jamal

    saat ini saya pakai satu halaman login tapi dibedakan dengan level login dengan pake middleware.

    yang saya tanyakan, bisa gk ya laravel buat 2 halaman login?
    misal :

    1). htts://nama_domain.com/login => untuk user biasa (pakai login gmail dan fb)
    2). htts://nama_domain.com/loginpanel-admin => untuk administrator (login input biasa)

    untuk ngatur route nya gmn ya untuk masing2 default base home (/) nya?

Tinggalkan Balasan