Pada tutorial ini, saya akan menjelaskan langkah-langkah membuat authorization dengan gates dan policy di laravel. Disini saya akan membuat Authorization sederhana dengan 3 role yaitu admin,operator dan user.
Authorization ini menentukan apakah role user tersebut diizinkan/ditolak dalam melakukan akses terhadap resources tertentu. kita hampir membutuhkan implementasi auth dan akses penggunaan berdasarkan role.
Gates menyediakan pendekatan berbasis closure yang dapat membantu kaian dalam menentukan aturan authorization, jadi jika kalian ingin memberikan suatu authorize yang tidak berhubungan dengan model tertentu, maka gates ini cocok untuk menerapkan logika tersebut.
Policies dapat kalian gunakan untuk logika group authorization untuk model tertentu atau resource. dengan menggunakan policy kalian dapat melakukan authorize user. sebagai contoh kalian akan mengizinkan user untuk melihat postingan mereka sendiri
Instal laravel
Langkah awal kita terlebih dahulu menginstall project laravel. silahkan kalian buka CMD dan jalankan perintah berikut ini.
composer create-project --prefer-dist laravel/laravel blog
konfigurasi database
Setelah kalian berhasil menginstal laravel, silahkan kalian buka file project laravel kalian dan silahkan buka file .env
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=isi dengan nama database anda DB_USERNAME=isi dengan username anda DB_PASSWORD=isi dengan password anda
membuat migration
Langkah selanjutnya kita akan membuat migration baru untuk menambahkan kolom baru bernama “role”. kita akan membuat tipe data enum untuk kolom role, dengan default author.
Silahkan jalankan perintah berikut ini.
php artisan make:migration add_role_column_to_users_table
Kemudian buka file migrasi yang telah dibuat dan paste kode di bawah ini
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) { $table->enum('role', ['user', 'manager', 'admin'])->default('user'); }); } /** * Reverse the migrations. * * @return void */ public function down() { } }
setelah itu silahkan jalankan perintah di bawah ini.
php artisan migrate
membuat seeder
Kita akan membuat data seeder untuk user. silahkan jalankan perintah di bawah ini.
php artisan make:seeder UsersTableSeeder
Silahkan buka file seeder yang telah di buat dan paste kode di bawah ini.
<?php namespace Database\Seeders; use Illuminate\Database\Seeder; use Illuminate\Support\Str; use DB; use Faker\Factory as Faker; class UsersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $faker = Faker::create('id_ID'); for($i=1; $i<5; $i++){ $role = ['admin','operator','author']; $random_role = array_rand($role); $data[$i] = [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => bcrypt('password'), 'remember_token' => Str::random(10), 'role' => $role[$random_role], ]; } DB::table('users')->insert($data); } }
Kemudian silahkan jalankan seeder dengan perintah berikut ini.
php artisan db:seed --class=UserTableSeeder
Silahkan kalian check data dummy yang telah dibuat di database
melakukan generate auth
Silahkan kalian install terlebih dahulu package laravel/ui dengan perintah di bawah ini.
BACA JUGA: CARA MEMBUAT LOGIN DENGAN AKUN GOOGLE DI LARAVEL 8
composer require laravel/ui
Setelah itu untuk membuat view auth dengan bootstrap jalankan perintah berikut ini.
php artisan ui bootstrap --auth
Kemudian kita jalankan perintah npm untuk compile view
install NPM
npm install
Run NPM
npm run dev
custom gates
Pada tahap ini, kita akan menentukan gates untuk akses setiap role user. kita akan menentukan dengan role “admin”, “operator” dan “author”. silahkan buka file AuthServiceProvider.php dan paste kode di bawah ini.
<?php namespace App\Providers; use App\Policies\PostPolicy; 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 = [ ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Gate::define('isAdmin', function ($user) { return $user->role == 'admin'; }); Gate::define('isOperator', function ($user) { return $user->role == 'operator'; }); Gate::define('isAuthor', function ($user) { return $user->role == 'author'; }); } }
menggunakan gates
Selanjutnya kita akan melakukan custom gates di dalam file blade. saya akan membuat 3 alert dengan text yang berbeda sesuai role. ketika user telah login, maka akan muncul alert dengan text role sesuai user login.
Silahkan update file resources/views/home.blade.php kalian seperti berikut ini.
@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 @can('isAdmin') <div class="alert alert-success" role="alert"> Role anda adalah Admin </div> @elsecan('isOperator') <div class="alert alert-success" role="alert"> Role anda adalah Operator </div> @else <div class="alert alert-success" role="alert"> Role anda adalah Author </div> @endcan </div> </div> </div> </div> </div> @endsection
Silahkan kalian jalankan project laravel dengan menjalankan perintah berikut ini
php artisan serve
Silahkan kalian login dengan data dummy yang telah dibuat dan lihat hasilnya seperti di bawah ini.
Admin
Operator
Author
gates di dalam controller
Kita juga bisa menggunakan gate di dalam controller. caranya seperti berikut ini.
public function store() { if (Gte::allows('isAdmin')) { dd('anda adalah admin'); } else { dd('anda bukan admin'); } }
public function store() { if (Gte::denies('isAdmin')) { dd('anda adalah admin'); } else { dd('anda bukan admin'); } }
public function store() { $this->authorize('isAdmin'); }
public function store() { $this->authorize('isAuthor'); }
Gates di dalam route dengan middleware
Kalian juga bisa membuat gate di dalam route dengan middleware dengan cara seperti berikut ini.
Route::get('post/create', 'PostController@create')->middleware('can:isAuthor')->name('create.post'); Route::get('post/update', 'PostController@update')->middleware('can:isOperator')->name('update.post'); Route::get('post/delete', 'PostController@delete')->middleware('can:isAdmin')->name('delete.post');
Membuat Policies
Pada tahap ini kita akan membuat policy. silahkan kalian jalankan perintah berikut ini.
php artisan make:policy PostPolicy
Kalian juga bisa menentukan model ketika menjalan perintah.
php artisan make:policy PostPolicy --model=Post
mendaftarkan policies
Kemudian silahkan daftarkan policy kalian. silahkan buka file app/Providers/AuthServiceProvider.php kemudian paste kode berikut ini.
namespace App\Providers; use App\Policies\PostPolicy; use App\Post; 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 = [ Post::class => PostPolicy::class, ]; /** * Register any application authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); // } }
setelah mendaftarkan policies, silahkan kalian buka file app/Policies/PostPolicy.php. kita dapat menambahkan metode untuk membatasi setiap aktifitas di dalam class PostPolicy seperti di bawah ini.
namespace App\Policies; use App\Post; use App\User; class PostPolicy { /** * Determine if the given post can be updated by the user. * * @param \App\User $user * @param \App\Post $post * @return bool */ public function update(User $user, Post $post) { return $user->id === $post->user_id; } }
di bawah ini merupakan logika untuk mendefinisikan bahwa hanya pengguna yang dapat memperbarui postingan mereka.
if ($user->can('update', $post)) { //user is authorized now }
policies dengan middleware
Laravel menyertakan middleware yang dapat mengotoriasasi suatu tindakan sebelum melakukan aktifitas bahkan mencapai route atau controller. kode nya sebagai berikut ini.
use App\Post; Route::put('/post/{post}', function (Post $post) { return view('post'); })->middleware('can:update,post');
atau kalian juga dapat melakukan seperti berikut ini.
Route::post('/post', function () { // The current user may create posts... })->middleware('can:create,App\Post');
policies di dalam controller
Kalian juga bisa melakukan authorize user di dalam controller. seperti di bawah ini.
public function update(Request $request, Post $post) { $this->authorize('update', $post); }
policies di dalam blade
selain itu kalian juga bisa menggunakan policy ke dalam blade.
@can('update', $post) @elsecan('create', App\Post::class) @endcan @cannot('update', $post) @elsecannot('create', App\Post::class) @endcannot
Penutup
Selamat kita telah berhasil membuat authorization menggunakan gates dan policy di laravel. Jika masih ada kesulitan ketika mengikuti tutorial diatas, kalian bisa komentar dibawah sini. Terimakasih.
mantab bang