Tanggal :28 Oktober 2020
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

Halo semuanya, saya Amirul seoarang Web Developer, suka membuat konten pembelajaran berupa artikel, video tutorial maupun podcast, saya juga suka makan dan foto makanan.

One Ping

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

44 Comments

  1. Afis Reply

    mas script yang ini diletakkan di mana ya ?

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

  2. Dahlan Reply

    gan mau tnya, saya kan mencoba script diatas, tapi kok pas mau dicoba login ke admin/login, muncul error ”

    Symfony\Component\Routing\Exception\RouteNotFoundException
    Route [login] not defined.
    http://127.0.0.1:8000/admin/login

    saya pake laravel 7, gimana nih gan? apaemang buat laravel 5 /6 aja ?

      1. Arifia Kasastra R Reply

        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.

  3. Hilmi Hidayat Reply

    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

    1. Hilmi Hidayat Reply

      oo sudah bisa mas, perlu menambahkan use Illuminate\Auth\AuthenticationException;

  4. Muhammad Ridha Reply

    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 Reply

          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?

  5. agungp Reply

    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

  6. kurnia Reply

    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)
    });

  7. ilham Reply

    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?

  8. ardiansah Reply

    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

  9. Nuzulul Reply

    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 Reply

        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

  10. Fallah Reply

    Symfony\Component\ErrorHandler\Error\FatalError
    Cannot redeclare App\Http\Controllers\Auth\AdminAuthController::__construct()

    maaf kalau begini apa yang salah. thanks

  11. Rizki Subagja Reply

    Jika saya misal ingin membuat banyak auth misal ada 4 (admin, guru, siswa, wali) apa untuk membuat auth yg lainnya melakukan hal yag sama?

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *