Tutorial Authorization dengan Gates pada Laravel

Tobi Ahmad
dotlocal
Published in
5 min readMay 2, 2020
Tutorial Memakai Authorization dengan Gates pada Laravel 7

Pada tutorial kali ini kita akan memakai fitur Authorization menggunakan Gates pada Laravel 7, dengan fitur ini kita bisa membuat role access pada setiap akses user.

Authorization pada project laravel sangat digunakan untuk implementasi auth dan akses user, selain menggunakan middleware, di Laravel juga terdapat Authorization menggunakan Gates dan Policy.

Contoh implementasi Authorization Gates:

  • Edit setting harus user dengan roles Admin.
  • Update konten harus user yang membuat konten tersebut.

Scope of This Chapter

Pada tutorial ini kita akan membahas tentang fitur Authorization pada framework Laravel, jangan lupa baca tutorial sebelumnya ditautan berikut ini:

Authorization Gates

Mari kita buat simple project untuk implementasi Authorization Gates

Step 1 — Install & Konfigurasi Laravel

Buat project baru dengan perintah composer berikut pada terminal:

composer create-project --prefer-dist laravel/laravel blog

Edit konfigurasi database pada file .env

// edit file .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=latihan_blog
DB_USERNAME=root
DB_PASSWORD=password

Untuk mempelajari instalasi dan konfigurasi pada Laravel bisa pelajari tautan berikut ini :

Step 2 — Tambah column role pada table users

Pada step ini kita akan membuat migration baru untuk menambahkan column role pada table users. Kita menggunakan datatype enum pada column role dengan value “admin”, “editor”, “author”, dan value “author” sebagai default.

Buka terminal dan jalankan perintah artisan berikut:

php artisan make:migration add_role_column_to_users_table
// Created Migration: xx_xx_xx_xx_add_role_column_to_users_table

Kemudian edit file migration xx_xx_xx_xx_add_role_column_to_users_table yang ada pada folder database/migrations:

<?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) {
$table->enum(‘role’, [‘admin’,’editor’,’author’])
->default(‘author’);

});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table(‘users’, function (Blueprint $table) {
//
});
}
}

Kemudian jalankan migration dengan perintah artisan berikut pada terminal:

php artisan migrate
Authorization Using Gates Laravel 7

Step 3— Buat Dummy Users dengan Seeder

Buat seeder untuk dummy data users dengan menggunakan perintah artisan make:seeder

php artisan make:seeder UsersTableSeeder
// Seeder created successfully.

Perintah artisan di atas membuat file baru di database/seeds/UsersTableSeeder.php

// edit file database/seeds/UsersTableSeeder.php
<?php
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
for($i=0;$i<15;$i++){
$input = ['admin','editor','author'];
$rand_keys = array_rand($input);
$data[$i] = [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => bcrypt('password'),
'remember_token' => Str::random(10),
'role' => $input[$rand_keys],
];
}

DB::table(‘users’)->insert($data);
}
}

Running seeder dengan perintah berikut pada terminal:

php artisan db:seed --class=UsersTableSeeder
// Database seeding completed successfully.

Silahkan check dummy data yang ada pada database

Authorization Using Gates Can Laravel

Step 4 — Generate Auth

Install package laravel/ui dengan perintah composer berikut pada terminal:

composer require laravel/ui

Kemudian untuk membuat view auth dengan bootstrap jalankan perintah ui berikut pada terminal:

php artisan ui bootstrap --auth

Setelah memilih type preset ui yang digunakan, kita perlu menjalankan perintah npm untuk compile view:

Install NPM

npm install

Run NPM

npm run dev

Step 5 — Membuat Custom Gates

Untuk membuat gates kita bisa menggunakan fitur facade Illuminate\Support\Facades\Gate, kita bisa define custom gate untuk user role access seperti “admin”, “editor”, “author”.

Buka file app\Providers\AuthServiceProvider.php

<?phpnamespace App\Providers;use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Gate::define('isAdmin', function($user) {
return $user->role == 'admin';
});
Gate::define('isEditor', function($user) {
return $user->role == 'manager';
});
Gate::define('isAuthor', function($user) {
return $user->role == 'user';
});
Gate::define('update-post', function ($user, $post) {
return $user->id === $post->user_id;
});
}
}

Step 6 — Menggunakan Gates Pada Controller

Untuk authorize suatu aksi menggunakan gates bisa menggunakan method allows atau denies, kita bisa menggunakan kode berikut pada logic yang akan kita buat, misalkan penerapan pada controller:

public function update(Request $request)
{
if (Gate::allows('isAdmin')) {
// akses logic untuk user dengan role admin
} else {
// akses logic untuk user selain role admin
}
}
public function store(Request $request)
{
if (Gate::allows('isAuthor')) {
// akses logic untuk user dengan role author
} else {
// akses logic untuk user selain role author
}
}
public function delete(Request $request)
{
if (Gate::denies('isAdmin')) {
// akses logic untuk user selain role admin
} else {
// akses logic untuk user dengan role admin
}
}

Pada script di atas facade Gate akan menggunakan data user yang sedang login, sedangkan jika kita ingin custom data user pada authorize bisa menggunakan method forUser pada facede Gate

public function updatePost()
{
$user = User::find(1);
$post = Post::find(10);
if (Gate::forUser($user)->allows('update-post', $post)) {
// user dapat mengedit post
}
if (Gate::forUser($user)->denies('update-post', $post)) {
// user tidak dapat mengedit
}
}

Authorizing Or Throwing Exceptions

Jika kita ingin ingin menggunakan autorize dan otomatis response error jika define Gate return-nya false, bisa menggunakan method Gate::authorize

public function delete()
{
$this->authorize('isAdmin');
// login authorize untuk user role "admin"
}

Via Middleware

Untuk menggunakan midlleware pada routes bisa menggunakan method middleware dengan menyisipkan key can:

// edit file routes/web.phpRoute::get('/home', 'HomeController@index')
->middleware('can:isAdmin')
->name('admin');

Jika kita test dengan mengakses halaman home menggunakan user yang menggunakan role “editor”, maka hasilnya error forbidden karena pada route kita telah menambahkan ->middleware(‘can:isAdmin’)

Authorization Using Gates via Middleware Laravel

Step 7— Menggunakan Gates Pada Blade

Kita bisa memanggil Gate dengan menggunakan directive @can yang ada pada template blade, edit file blade home.blade.php:

// file home.blade.php
@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">
{{ session('status') }}
</div>
@endif
@can('isAdmin')
<h3>Anda punya akses sebagai Admin</h3>
@elsecan('isEditor')
<h3>Anda punya akses sebagai Editor</h3>
@else
<h3>Anda punya akses sebagai Author</h3>
@endcan
</div>
</div>
</div>
</div>
</div>
@endsection

Step 7— Buka route pada browser

Jalankan perintah php artisan serve pada terminal, dan akses routes login pada browser, kemudian kita check halaman home.

Authorization Using Gates Via Blade Templates Laravel

Next Chapter

Support the Author

Jika suka dengan artikel ini, bisa support saya ditautan berikut ini

Cheers
Tobi Ahmad
Founder of Dot Local

--

--

Tobi Ahmad
dotlocal

Web Developer, Blogger, & Open source enthusiast.