Authorization Using Gates Laravel 7

Authorization Using Gates Laravel 7

Pendahuluan

Membedakan antara authentication dan authorization sering kali menjadi sebuah masalah baru karena keduanya hampir dianggap sama tapi memiliki fungsi yang berbeda, dimana authentication biasanya digunakan untuk memproteksi sebuah halaman dari user yang tidak memiliki akses ke dalamnya. Sedangkan authorization biasanya digunakan untuk memberikan batasan pada setiap user yang sudah memiliki akses.

Materi kali ini kita akan belajar bagaimana membuat authorization menggunakan gates yang merupakan fitur bawaan dari Laravel. Kebetulan Laravel 7 sudah release, maka kita membahasnya dengan menggunakan Laravel versi terbaru ini. Berikut adalah cara membuat fitur Authorization using gates di Laravel 7.

Baca Juga: CkEditor Image Upload di Laravel 6

Gate Authorization Laravel

Memulainya dari awal, maka kita harus meng-install Laravel dan pastikan sudah versi php dan module php kamu sudah memenuhi requirements dari Laravel 7. Install terlebih dahulu dengan command

composer create-project --prefer-dist laravel/laravel dw-authorization

Buka file .env dan sesuaikan informasi database kamu

DB_DATABASE=dw-authorization
DB_USERNAME=root
DB_PASSWORD=

Kemudian kita akan menambahkan field role ke dalam table users, dari command line, buat migration

php artisan make:migration add_role_column_to_users_table

Buka file migration yang baru saja di-generate dan modifikasi menjadi

<?php

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

class AddRoleColumnToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            //TAMBAHKAN KOLOM ROLE DENGAN TIPE ENUM DAN MEMILIKI BEBERAPA PILIHAN ROLE
            $table->enum('role',  ['user', 'manager', 'admin'])->default('user')->after('password');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('role');
        });
    }
}

Terapkan migration yang ada agar dikonversi menjadi struktur table dengan menggunakan php artisan migrate

Langkah selanjutnya adalah membuat seeder sebagai dummy users, jalankan command

php artisan make:seeder UserTableSeeder

Buka file database/seeds/UserTableSeeder.php dan modifikasi menjadi

<?php

use Illuminate\Database\Seeder;
use App\User;

class UserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //KETIGA DATA INI AKAN DIJADIKAN DUMMY USER DENGAN MASING-MASING ROLE YANG DIMILIKINYA
        User::create([
            'name' => 'Anugrah Sandi',
            'email' => '[email protected]',
            'password' => bcrypt('secret'),
            'role' => 'admin'
        ]);

        User::create([
            'name' => 'Riski Amelia',
            'email' => '[email protected]',
            'password' => bcrypt('secret'),
            'role' => 'manager'
        ]);

        User::create([
            'name' => 'DaengWeb',
            'email' => '[email protected]',
            'password' => bcrypt('secret'),
            'role' => 'user'
        ]);
    }
}

Register seeder di atas, buka file database/seeds/DatabaseSeeder.php dan tambahkan baris berikut ke dalam method run().

$this->call(UserTableSeeder::class);

Terapkan seeder yang ada dengan command php artisan db:seed. Selanjutnya kita akan meng-install authentication package yang dimana sejak Laravel 6 sudah dibuat terpisah dari Laravel itu sendiri. Dari command line, jalankan perintah berikut secara bergantian

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

Ada dua bagian yang akan terlihat mencolok pada materi kali ini, dimana menu navigasi akan kita tampilkan berdasarkan menu role masing-masing user yang sedang login dan bagian lainnya adalah content di halaman home akan menampilkan role user. Buka file resources/views/home.blade.php dan modifikasi menjadi

@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">Dashboard</div>

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

                    <p>
                        Hi <strong>{{ auth()->user()->name }}</strong>, 
                        Anda login sebagai 
                        @can('isAdmin')
                            <span class="btn btn-success">Admin</span>
                        @elsecan('isManager')
                            <span class="btn btn-info">Manager</span>
                        @else
                            <span class="btn btn-warning">User</span>
                        @endcan
                    </p>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Penjelasan: Kita menggunakan directive @can dan diikuti dengan nama gates yang nantinya akan didefinisikan dimana jika gate tersebut bernilai true, maka menu yang diapitnya akan ditampilkan.

Adapun untuk men-handle menu navigasinya, buka file resources/views/layouts/app.blade.php dan tambahkan tag berikut didalam tag <ul> yang memiliki komentar Right side of navbar.

<li class="nav-item">
    <a href="{{ url('/home') }}" class="nav-link">Home</a>
</li>
@can('user')
<li class="nav-item">
    <a href="" class="nav-link">Transaksi</a>
</li>
@endcan

@can('isManager')
<li class="nav-item">
    <a href="" class="nav-link">Laporan</a>
</li>
@endcan

@can('isAdmin')
<li class="nav-item">
    <a href="" class="nav-link">Pengaturan</a>
</li>
@endcan

Tugas terakhir adalah mendefinisikan gate authorization di Laravel untuk masing-masing role, buka file app/AppServiceProvider.php dan tambahkan code berikut di dalam method boot()

public function boot()
{
    //MEMBUAT GATE DIMANA PARAMETER PERTAMA ADALAH NAMA GATE-NYA
    //DAN PARAMETER SELANJUTNYA ADALAH CLOSURE FUNCTION
    //DIMANA KITA MELAKUKAN PENGECEKAN, JIKA USER YANG SEDANG LOGIN ROLE BERNILAI TRUE, MAKA DIA AKAN DIIZINKAN
    Gate::define('isAdmin', function($user) {
        return $user->role == 'admin';
     });

     Gate::define('isManager', function($user) {
         return $user->role == 'manager';
     });

     Gate::define('isUser', function($user) {
         return $user->role == 'user';
     });
}

authorization laravel 7

Selain itu, kita juga bisa menggunakan gate diatas pada routing dengan memanfaatkan middleware. Buka routes/web.php dan ubah routing home menjadi.

Route::get('/home', 'HomeController@index')->middleware('can:isAdmin')->name('home');

Kemudian login menggunakan user yang bukan admin, maka kita akan memperoleh tampilan berikut

laravel authorization middleware

Baca Juga: Authentication Menggunakan Username / Email Laravel 6

Kesimpulan

Penerapan Laravel authorization menggunakan Gate pada versi 7 ini tidak jauh berbeda dengan versi-versi sebelumnya, jadi poin saya adalah perhatikan perubahan dari setiap versi Laravel, sehingga teman-teman tidak harus terpaku untuk mencari tutorial yang harus sesuai dengan versinya, sehingga membuat kita terhenti karena tidak kunjung menemukan materi dengan versi yang sama.

Adapun dokumentasi code dari artikel ini bisa dilihat di Github.

 

Category:
Share:

Comments