Header Ads Widget

Authorization Dengan GATES Laravel 8

 

Authentication Atau Authorization kadang membuat sebagian orang mengalami kebingungan, kenapa ? karena mereka berdua itu terlihat sama, namun sebenarnya mereka berbeda.

Authentication berguna agar memproteksi user yang tidak memiliki akses ke dalam aplikasi. Sedangkan 

Authorization berguna untuk membatasi akun user. Misalnya admin, manager, atau user. Atau yang biasa kita sebut ROLE / ATURAN.

Oke dari pada banyak cingcong langsung skuy dah ! 

langkah pertama install dulu laravel nya, O iya mimin menggunakan LARAVEL 8.

composer create-project --prefer-dist laravel/laravel rolelaravel
Setelah sudah sukses di install, maka selanjutnya setup database kamu.
Edit file dotENV nya 

DB_DATABASE=rolelaravel
DB_USERNAME=root
DB_PASSWORD=
Kemudian kita akan menambahkan Field ROLE kedalan table user menggunakan migration

php artisan make:migration add_role_column_to_users_table
Selanjutnya buka file migration yang baru saja di migrate, dan edit file tersebut dengan script ini

<?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');
        });
    }
}
Jika sudah maka lakukan migrate ke database menggunakan command 
php artisan migrate
Jika sudah membuat rolenya dan sudah me-migratekannya kemudian kita membuat user dummy nya dengan command
php artisan make:seeder UserTableSeeder
Kemudian edit file database/seeds/UserTableSeeder.php menjadi

<?php

use Illuminate\Database\Seeder;
use App\Models\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' => 'Arikun',
            'email' => 'tolong@gmail.com',
            'password' => bcrypt('secret'),
            'role' => 'admin'
        ]);

        User::create([
            'name' => 'Melia',
            'email' => 'tolongg@gmail.com',
            'password' => bcrypt('secret'),
            'role' => 'manager'
        ]);

        User::create([
            'name' => 'niisan',
            'email' => 'niisan@gmail.com',
            'password' => bcrypt('secret'),
            'role' => 'user'
        ]);
    }
}
Jangan lupa tambahkan namespacenya setelah tanda ?php Di paling atas

namespace Database\Seeders;
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';
     });
}
Jangan lupa tambahkan dibagian paling atas setekah ?php
use Illuminate\Support\Facades\Gate;

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', [App\Http\Controllers\HomeController::class, 'index'])->middleware('can:isAdmin')->name('home');
Maka ketika user biasa yang login dan bukan admin maka akan muncul seperti ini 


Semoga di artikel ini tentang Authorization Dengan GATES Laravel 8 ,ini bisa bermanfaat untuk anda.
Jika anda merasa terbantu dengan tutorial di all-onetech, kalian bisa ikuti di Facebook dan Telegram.

Selamat mencoba

Posting Komentar

0 Komentar