Authorization Dengan GATES Laravel 8

Lun4T1c
4 min readNov 3, 2020

--

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

<?phpuse 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

<?phpuse 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.
Selamat mencoba

--

--

Lun4T1c
Lun4T1c

Written by Lun4T1c

Network Engineer, Web Developer, and Security Enthusiasm.

No responses yet