Menggunakan Middleware Untuk Authentication (Hak Akses) di Laravel 8

Menggunakan Middleware Untuk Authentication (Hak Akses) di Laravel 8

Admin
Admin・ 15 Oktober 2021
9 min read ・ 20191 views

Laravel Middleware - Hi Coderrs 👋 Di artikel ini saya akan share cara penggunaan middleware di Laravel 8. Di percobaan ini nanti, saya akan simulasikan membuat middleware untuk pembagian hak akses user atau memberikan proteksi sebuah halaman agar hanya bisa diakses oleh user dengan role Admin. Sebelum masuk ke koding, alangkah lebih baiknya kita sedikit berkenalan dengan middleware di Laravel.

Apa itu Middleware ?

Dijelaskan oleh Laravel, bahwa middleware menyediakan mekanisme untuk melakukan pemeriksaan dan pemfilteran terhadap HTTP request yang masuk ke aplikasi kita. Misalnya, Laravel telah menyertakan middleware yang memverifikasi apakah user aplikasi kita sudah diautentikasi atau belum. Jika user belum diautentikasi, maka middleware akan mengarahkan user ke halaman login. Namun jika user telah diautentikasi, middleware akan mengizinkan request dari user tersebut untuk melanjutkan menggunakan aplikasi kita.

Oke, mari kita langsung saja ke langkah-langkah penggunaan middleware untuk authentication atau pembagian hak akses user di Laravel 8. 🚀

Step 1: Install Laravel

//via Laravel Installer
composer global require laravel/installer
laravel new laravel-middleware

//via Composer
composer create-project laravel/laravel laravel-middleware

Pada langkah yang pertama ini, kita perlu menginstall laravel versi terbaru (saat ini versi 8) yang akan kita coba untuk implementasi middleware di laravel 8 untuk membuat hak akses user berdasarkan role. Untuk installasi laravel bisa menggunakan laravel installer atau menggunakan composer seperti contoh di atas.

Silahkan memilih salah satu cara yang ingin digunakan untuk installasi laravel. Dari kedua contoh perintah installasi laravel di atas, akan sama-sama menghasilkan atau generate laravel project dengan nama laravel-middleware.

Step 2: Setup Database

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_middleware
DB_USERNAME=root
DB_PASSWORD=

Selanjutnya, buat database baru untuk menyimpan data-data sample yang akan kita gunakan pada percobaan ini. Jika kamu menggunakan xampp sebagai local development, silahkan buat database baru di localhost/phpmyadmin. Disini saya beri contoh, saya membuat database baru dengan nama laravel_middleware. Kemudian jangan lupa juga untuk menyesuaikan DB_DATABASE pada file .env seperti pada contoh di atas.

Step 3: Install Laravel UI Package

composer require laravel/ui
php artisan ui bootstrap --auth
npm install && npm run dev

Kita perlu fitur authentication (register, login dan logout) untuk implementasi menggunakan middleware di laravel project kita. Untuk itu, disini saya contohkan menggunakan laravel ui package untuk membuat fitur authentication tersebut.

Silahkan install laravel ui package di laravel project kita dengan menjalankan perintah-perintah seperti di atas secara berurutan.

*Sebelum menginstall laravel ui package tersebut, pastikan kamu sudah masuk ke direktori project dengan menjalankan perintah cd laravel-middleware pada terminal. 

Step 4: Update User Migration

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->boolean('isAdmin');
            $table->rememberToken();
            $table->timestamps();
        });
    }

By default, laravel telah menyediakan file migration untuk users table. Tapi disini, kita perlu menambahkan field baru yaitu dengan nama isAdmin dan mempunyai type data boolean. Field ini nanti berfungsi untuk menentukan, apakah user tersebut merupakan Admin atau bukan. Jika user tersebut merupakan admin, maka isAdmin bernilai 1 atau true. Tapi jika user tersebut bukan Admin, maka isAdmin bernilai 0 atau false.

Jadi, silahkan buka file user migration yang terletak di database/migrations/{timestamp} _create_users_table.php, lalu tambahkan $table->boolean('isAdmin'); seperti kode di atas.

php artisan migrate

Jika sudah memperbarui file user migration, lanjutkan dengan menjalankan perintah php artisan migrate untuk memigrasi file-file migration ke database.

Step 5: Membuat Middleware

php artisan make:middleware isAdmin

Kemudian, kita perlu membuat file middleware untuk melakukan pemeriksaan, apakah user tersebut adalah Admin atau bukan. Jalankan perintah artisan seperti di atas untuk membuat file middleware dengan nama isAdmin.

app/Http/Middleware/isAdmin.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class isAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (\Auth::user() &&  \Auth::user()->isAdmin == true) {
             return $next($request);
        }

        return back()->with('error','Opps, You\'re not Admin');
    }
}

Kemudian, buka file middleware isAdmin yang telah digenerate tersebut. File tersebut terletak didirektori app/Http/Middleware/isAdmin.php. Pada function handle, sesuaikan kodenya menjadi seperti kode di atas. Pada function handle ini, kita melakukan pemeriksaan user, apakah user tersebut telah diautentikasi dan merupakan admin ? jika iya, maka user tersebut bisa lanjut, tapi jika tidak maka akan diarahkan ke halaman awal dan menampilkan flash message "Opps, You're not Admin".

app/Http/Kernel.php

protected $routeMiddleware = [
       ....
       ....
        'admin' => \App\Http\Middleware\IsAdmin::class,
    ];

Setelah membuat middleware, jangan lupa untuk mendaftarkannnya di file Kernel.php atau lebih tepatnya di dalam array routeMiddleware seperti kode di atas.

Step 6: Seeding

Setelah membuat middleware, mari kita buat sample user untuk kita gunakan testing nantinya.

Models/User.php

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

Karena pada langkah sebelumnya, kita menambahkan field baru di file user migration yaitu isAdmin, jadi kita juga perlu menambahkan isAdmin di dalam method protected $fillable di file Models/User.php seperti kode di atas.

database/seeders/DatabaseSeeder.php

public function run()
    {
        \DB::table('users')->insert([
            [
                'name' => 'Admin',
                'email' => 'admin@gmail.com',
                'password' => \Hash::make('12345678'),
                'isAdmin' => true
            ],
            [
                'name' => 'User',
                'email' => 'user@gmail.com',
                'password' => \Hash::make('12345678'),
                'isAdmin' => false
            ]
        ]);
    }

Selanjutnya, mari kita buat dua sample user yang memiliki peran admin dan bukan. Buka file di database/seeders/DatabaseSeeder.php. Lalu pada function run, tambahkan kode untuk insert data ke table users seperti kode di atas.

php artisan db:seed

Selanjutnya, jalankan perintah php artisan db:seed untuk proses insert data ke database menggunakan seeder.

Step 7: Menambahkan Route

routes/web.php

Route::middleware(['auth', 'admin'])->group(function () {
    Route::get('admin', function () {
        return 'admin page';
    });
});

Ok, kita sudah membuat middleware dan membuat sample data user untuk testing nanti. Sekarang kita perlu menambahkan route baru, yang nantinya route ini akan kita kasih middleware agar hanya dapat diakses oleh user yang sudah diautentikasi dan mempunyai peran Admin.

Silahkan buka file routes/web.php, lalu tambahkan kode seperti di atas.

Step 7: Menambahkan Flash Message

@if (session('error'))
     <div class="alert alert-danger alert-dismissible fade show" role="alert">
          {{ session('error') }}
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
             <span aria-hidden="true">&times;</span>
         </button>
    </div>
@endif

Selanjutnya, mari kita buat flash message yang akan ditampilkan jika ada user yang bukan admin tapi mencoba mengakses ke halaman yang memang diperuntukkan untuk user Admin. Buka file di resources/views/home.blade.php, lalu tambahkan kode seperti di atas tepat di atas card.

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            @if (session('error'))
                <div class="alert alert-danger alert-dismissible fade show" role="alert">
                    {{ session('error') }}
                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
            @endif
            <div class="card">
                <div class="card-header">{{ __('Dashboard') }}</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    {{ __('You are logged in!') }}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Sehingga, file home.blade.php sekarang menjadi seperti kode di atas.

Step 8: Testing

laravel middleware role authentication

Oke, setelah melalui langkah-langkah mulai dari install laravel, setup database, install laravel ui, membuat middleware, membuat sample data dengan seeder, menambahkan route baru, hingga langkah membuat tampilan flash message, sekarang waktunya testing. Silahkan coba jalankan laravel project dengan menjalankan perintah php artisan serve, kemudian buka laravel project di browser.

Untuk testing yang pertama, cobalah untuk login dengan menggunakan akun user atau dengan email user@gmail.com dan password 12345678. Setelah masuk ke halaman home, cobalah untuk mengakses halaman admin atau dengan URL 127.0.0.1:8000/admin atau laravel-middleware.test/admin, maka kamu akan diarahkan kembali ke halaman home dan akan menampilkan flash message "Opps, You're not Admin".

Kemudian untuk testing yang kedua, cobalah untuk login menggunakan akun admin atau dengan email admin@gmail.com dan password 12345678. Setelah masuk ke halaman home, cobalah untuk mengakses halaman admin atau dengan URL 127.0.0.1:8000/admin atau laravel-middleware.test/admin, maka kamu akan bisa diarahkan halaman admin.

Kesimpulan

Dengan middleware, kita dapat memfilter user dan memproteksi sebuah halaman agar hanya bisa diakses oleh user yang mempuyai peran tertentu. Middleware sangat dibutuhkan saat kita membuat sistem atau aplikasi yang dalamnya terdapat pembagian hak akses user seperti super admin, admin, editor, atau role user lainnya.

Sekian artikel kali ini yang telah membahas cara penggunaan middleware untuk memfilter user yang mempunyai peran admin dan yang bukan admin. Selamat mencoba, semoga artikel ini bisa bermanfaat dan sampai jumpa di artikel berikutnya. 👋 👨‍💻 🚀

Tinggalkan Komentar
Loading Comments