0% menganggap dokumen ini bermanfaat (0 suara)
60 tayangan14 halaman

Tutorial Laravel 8 pt.22 Authorization

Dokumen tersebut membahas tentang penambahan fitur otorisasi dalam sebuah aplikasi untuk memberikan hak akses yang berbeda kepada pengguna berdasarkan peran mereka, seperti admin atau pengguna biasa. Langkah-langkah yang dijelaskan adalah menambahkan kontroler dan route untuk mengelola kategori postingan, serta membatasi aksesnya hanya untuk pengguna yang telah terotentikasi.

Diunggah oleh

Ryan Dhika Permana
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai TXT, PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
60 tayangan14 halaman

Tutorial Laravel 8 pt.22 Authorization

Dokumen tersebut membahas tentang penambahan fitur otorisasi dalam sebuah aplikasi untuk memberikan hak akses yang berbeda kepada pengguna berdasarkan peran mereka, seperti admin atau pengguna biasa. Langkah-langkah yang dijelaskan adalah menambahkan kontroler dan route untuk mengelola kategori postingan, serta membatasi aksesnya hanya untuk pengguna yang telah terotentikasi.

Diunggah oleh

Ryan Dhika Permana
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai TXT, PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 14

>> Menambahkan fitur otorisasi, bagaimana kita buat user2 kita yang berhasil

registrasi
itu memiliki hak akses yang berbeda, dalam hal ini simpelnya ada user yang
hanya bisa
mengelola post, atau sebagai author, ada user yang memiliki hak akses sebagai
administrator

>> Jadi ceritanya use case untuk aplikasi kita adalah nanti kita akan punya 1
admin yang
bisa mengelola hal lain selain user biasa, contohnya nanti kita akan coba agar
si
admin bisa mengelola kategori. Kalau kedepannya kita bisa mengelola hal lain

>> Misalnya bisa menambahkan user lewat dashboard atau menambahkan fitur lain
silahkan.
Tapi kita tentukan dlu bahwa aplikasi kita punya admin yang bisa menambahkan
kategori
sehingga nanti user yang login bisa menentukan kategori dari postnya sesuai
dengan
kategori yang dikelola oleh admin

>> Laravel juga mendukung untuk pengelolaan roles, atau itu disebutnya policies
yang lebih
kompleks lagi sehingga di dalam aplikasinya kita bisa menentukan banyak roles
selain
admin dan user biasa

>> Untuk lebih jelasnya kita cek di dokumentasi laravelnya dengan mengetik
authorization
kita baca introductionnya. Selain dari layanan otentikasi, otentikasi ini untuk
menentukan
sebuah user login atau tidak, kalau otorisasi itu setelah login user bisa
ngapain aja

>> Laravel juga menyediakan cara sederhana untuk melakuakan otorisasi dari aksi
user terhadap
sumber dayanya atau terhadap halaman2nya, contohnya meskipun seorang user telah

terotentikasi atau sudah bisa login, user tersebut bisa saja tidak punya hak
akses ke
update dan delete dari model tertentu di dalam database

>> Jadi dia sudah login, melihat data bisa, tapi ngedit dan hapus gk bisa, itu
namanya
otorisasi. Fitur otorisasi di laravel menyediakan sebuah cara yang mudah dan
terorganisir
untuk mengelola pemeriksaan atau pengecekan hak akses ini

>> Ada 2 cara utama di laravel untuk melakukan otorisasi dengan menggunakan yang
namanya
gates atau policies, yang lebih simpel itu gates, jadi kita kasih pagar ke
tempat2 yang
seorang user gk boleh akses

>> Sedangkan policies lebih kompleks. Kita akan coba menggunakan gates, kalau kita
nanti
kedepannya menggunakna starter kit punya laravel, misalnya menggunakan
jetstream atau
menggunakan breeze yang di dalamnya sudah tertanam fitur otentikasi dan
otorisasi yang
dapat kita gunakan

>> Sebetulnya di belakang layar, yang mereka gunakan tetep aja gates dan policies.
Penting
bagi kita untuk mengetahui bagaimana laravel bekerja dengan authorization,
sehingga
kedepannya ketika kita menggunakan starter kitnya, udah ngerti

>> Kita mau coba sesuatu yang lebih simpel dari ini. Ceritanya kita mau bikin dlu
fitur
pengelolaan kategori di dalam dashboard. Jadi kita balik ke web browser, kalau
kita
login, disini halaman dashboard kita baru bisa mengelola post

>> Kalau kita bikin post, itu ada kategori, ini kategorinya sudah kita bikin lewat
seeder
jadi kalau mau nambah kategori baru, gk bisa harus lewat seedernya lagi, atau
kita
langsung suntikan ke dalam databasenya

>> Jadi ceritanya kita akan tambahin kategori di sidebar kita, kita bikin
controller yang
kita beri nama AdminCategoryController, jadi karena dia hanya bisa diakses oleh
admin
kita bikin namanya seperti itu, tipe controllernya kita pilih resource, supaya
gampang

>> Walaupun nanti kita hanya akan bikin index aja. Karena kita tahu cara nambah,
edit dan
hapus. Kita lakukan sendiri. Kita akan menghubungkan controller ini dengan
model yang
namanya Category

>> Jika sudah, maka akan dibuatkan otomatis controller dengan menggunakan command
palette.
Di dalamnya ada index, ada create, store, show, edit, update, dan destroy.
Selanjutnya
Sebelum kita edit halaman ini, kita coba dlu buka route kita

>> Kita bikin route baru untuk mengarah ke controller category, jadi kita tulis
route lalu
gunakan resource, yang kalau ada request ke halaman dashboard/categories, maka
dia akan
mengarah ke controller admincategorycontroller lalu class
Misal :
Route::resource('/dashboard/category', AdminCategoryController::class);

>> Ini sudah terhubung dengan index, show, create, store, edit, update dan destroy
yang ada
di AdminCategoryController. Jika kita ingin tahu route apa saja yang digunakan
kita bisa
lihat dengan mengetikkan php artisan route:list di terminal vsc

>> Jika kita lihat, di paling atas, tiba2 ada category, jadi ada category ke
index, untuk
nampilin semua category, ada store buat melakukan proses penambahan kategori
baru, ada
create buat nampilin form category, show buat nampilin detail category, ada
update, destroy
dan edit

>> Jadi udah otomatis dibikinin, klo kita gk ingin ada show, kita akan ngasih tahu
di resource
untuk ngasih pengecualian untuk show, kita bisa kasih except()
Misal :
Route::resource('/dashboard/category', AdminCategoryController::class)-
>except('show');

>> Kalau gk dipake jangan dibikin supaya bisa diakses oleh urlnya, meskipun nanti
tampilannya
kosong. Kalau sudah, kalau kita cek di terminal maka route show ilang. Sekarang
kita
coba ke controllernya di bagian index kita return dengan isian ini adalah
halaman
categories. Kita kasih ini supaya ngetes, bisa diakses atau tidak
Misal :
public function index()
{
return 'ini adalah halaman categories';
}

>> Kita ke browser, lalu kita ketik di url /categories, maka sudah bisa diakses,
tapi sekarang
kalau kita logout, lalu kita arahkan ke /dashboard/categories, maka bisa masuk.
Karena
kita belum kasih authenticate lewat middleware, walaupun ini akan kita ubah
juga

>> Cuman kita tahu karena kita gk kasih middleware('auth'), siapapun bisa akses,
jadi kita
kasih middleware('auth')
Misal :
Route::resource('/dashboard/categories', AdminCategoryController::class)
->except('show')->middleware('auth');

>> Jika kita balik ke browser, maka ketika kita ngakses url dashboard/categories,
maka akan
menuju halaman login, karena kita kasih tau siapapun yang belum login, kalau
ngakses
sesuatu di dalam dashboard itu gk boleh

>> Pastikan kalau ada error, controllernya belum di includekan silahkan use di
atas. Kalau
sudah otomatis ditambahkan oleh vscode, gk apa.
Misal :
use App\Http\Controllers\AdminCategoryController;

>> Sekarang kita coba bikin tampilan supaya tampilannya bisa diakses kalau kita
sudah login
Kita tambahkan link di sidebar yang mengarah ke category. Kita buka file
sidebar kita yang
ada di dalam folder dashboard/layouts

>> Ceritanya kita mau nambahin list baru, tapi kita tidak akan tambahkan li,
karena itu akan
menjadi bagian ul yang terpisah di tag ul paling bawah. Kedepannya akan kita
bikin agar
dia hanya bisa diakses oleh admin. Jadi kita punya ul baru, tapi sebelumnya
kita kasih
judul dlu

>> Judulnya akan kita samakan di template bootstrap kita yang examples. Jadi
disini kita akan
punya tag h6 yang tulisannya administrator, tapi supaya sama stylenya kita
ketik ulang
di dalamnya ada tag span yang tulisannya administrator, kita beri class di tag
h6 namanya
sidebar-heading displaynya flex

>> Supaya dia tersimpan di tengah2, lalu kita kasih justify-content-between lalu
align-item-center, kita kasih px-3 untuk beri padding sumbu x, mt margin top
nya 4, mb
margin bottomnya 1 dan textnya abu2 dengan memberi class text-muted
Misal :
<h6 class="sidebar-heading d-flex justify-content-between
align-items-center px-3 mt-4 mb-1 text-muted">
<span>Administrator</span>
</h6>

>> Di bawahnya kita bikin ul, ulnya sama seperti tag ul di atas, jadi kita copas
saja classnya
baru di dalam tag ulnya kita bikin tag li yang di dalamnya classnya sama yang
isi tag li
nya link juga sama seperti tag li yang di atas
Misal :
<a class="nav-link {{ Request::
is('dashboard/categories*') ? 'active' : '' }}" aria-current="page"
href="/dashboard/categories">
<span data-feather="grid"></span>
Post Categories
</a>

>> Jadi kalau ada link yang requestnya mengarah ke dashboard lalu ke categories,
lalu kita kasih
tanda * supaya nanti selalu active di halaman apapun yang masuk ke dalam
categories, lalu
hrefnya kita arahkan ke categories. Tulisannya kita ganti Post Categories, icon
kita ganti
jadi yang namanya grid

>> Sekarang kalau di klik, karena dia mengarah ke index, sekarang yang kita
butuhin adalah
viewnya, kalau kita masuk ke controller admincategory, di function index kita
arahkan
return ke view, viewnya ada di dalam dashboard, lalu categories, lalu ada file
yang
namanya index.blade.php
Misal :
public function index()
{
return view('dashboard.categories.index');
}

>> Sekarang kita bikin filenya, di folder dashboard kita bikin folder baru namanya
categories
di dalam categories bikin file namanya index.blade.php. Kalau sudah kita buka
yang index
posts supaya bisa kita copas isinya

>> Kita copas semua isi dari file index di posts, jika kita cek di browser, maka
akan error
dengan pesan gk tau variable post, karena belum kita kirimin dari controller.
Yang akan
kita kirimin di index adalah category

>> Jadi di dalam view kita kasih parameter kedua berupa array, kita bikin
categoires itu
kita ngambil dari model category, lalu kita cari all.
Misal :
public function index()
{
return view('dashboard.categories.index', [
'categories' => Category::all()
]);
}

>> Sekarang kita edit index categories satu2 dari atas, extends sudah oke,
container sudah oke,
lalu di tag h1 bukan my post, tapi Post Categories, lalu seleksi kondisi untuk
nampilin
success biarkan aja, karena kalau kita butuh notifikasi ketika category
berhasil ditambahkan
ini pasti butuh
Misal :
<h1 class="h2">My Categories</h1>

>> Lalu kita masuk ke tombol tambah category, ini nanti akan mengarah ke
categories, lalu
isi dari tag a nya jadi create new category, scroll lagi di tag th ada nomor,
lalu ada
th kedua kita kasih isi Category Name, karena hanya ada satu aja
Misal :
<div class="table-responsive col-lg-8">
<a href="/dashboard/categories/create" class="btn btn-primary" mb-3>Create
new category</a>
<table class="table table-striped table-sm">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Category Name</th>
<th scope="col">Action</th>
</tr>
</thead>

>> Kalau kita ke database kita, kita cuman ada data id, name dan slug. Slug gk
usah ditampilin
kita hanya butuh name aja, jadi cuman ada satu, jadi cuman ada 3 tag th, action
tetap ada

>> lalu foreachnya ganti jadi categories as category. loop iteration biarkan, lalu
di tag td
nya ganti semuanya jadi category, lalu tag a dan tag form kita arahkan hrefnya
ke categories
lalu di dalam bladenya ganti jadi category
Misal :
@foreach ($categories as $category)
<tr>
<td>{{ $loop->iteration }}</td>
<td>{{ $category->name }}</td>
<td>
<a href="/dashboard/categories/{{ $category->slug }}"
class="badge bg-info"><span data-feather="eye"></span></a>
<a href="/dashboard/categories/{{ $category->slug
}}/edit" class="badge bg-warning"><span data-feather="edit"></span></a>
<form action="/dashboard/categories/{{ $category-
>slug }}" method="post" class="d-inline">

>> Jika di cek di browser maka akan muncul categorynya. Kalau terlalu lebar kita
kecilin
ukuran tablenya dan pesan success nya diganti jadi 6. Sekarang problemnya
adalah, semua
user yang login bisa masuk ke menu category

>> Misal, kita melakukan login lagi dengan user yang berbeda sesuai dengan di
database. Maka
user tersebut bisa lihat juga, padahal kita ingin cuman Ryan Dhika aja yang
bisa lihat
menu post categories dan bisa mengaksesnya. Karena kita ingin Ryan Dhika
sebagai admin

>> Karena aplikasi ini gk terlalu kompleks, adminnya satu dlu aja, kedepannya
kalau kita mau
nambah admin itu mudah. Caranya kita coba versi yang simple dlu kita ke
kodingannya. Sekarang
kita akan matikan middlewarenya, jadi kita gk akan pakai middleware lagi

>> Kita akan ngecek manual udah login apa belum, kalau udah login dia Ryan Dhika
Permana
atau bukan, jadi gk lagi pakai middleware. Sekarang ini bisa diakses oleh
siapapun. Tapi
untuk mencegahnya kita masuk ke controllernya

>> Sekarang kita kasih pengkondisiannya di paling atas method index, sebelum
menampilkan
view. Jadi sebelum nampilin view, cek dlu dia udah login atau belum. Jadi cara
ngceknya
pakai bantuan dari method auth(), jadi kalau kita tulis if auth ini bisa kita
pakai method
guest()

>> Kalau dia adalah guest() artinya guest itu belum login, maka kasih pesan
abort() dan kasih
statusnya adalah 403, 403 itu forbidden. Jadi kalau belum login kasih ini. Kita
cek di
browser
Misal :
public function index()
{
if (auth()->guest()) {
abort(403);
}

>> Kita masuk category, aman, karena dia sudah login, kita copas dlu urlnya, lalu
kita logout
Kalau kita masuk ke url category, maka akan tampil pesan forbidden, gk kembali
ke login,
tapi sekarang forbidden

>> Sekarang, kalau dia udah login tapi bukan Ryan Dhika Permana. Misal kita login
pakai user lain
maka Post Categories masih bisa diakses. Caranya, kita kasih satu lagi seleksi
kondisi if
jika dia bukan Ryan Dhika Permana. Kita bisa ngambil user yang sudah ter
otentikasi dengan
cara panggil usernya

>> Jadi kalau user yang lagi login ini usernamenya bukan Ryan Dhika Permana, kita
abort juga
Misal :
if (auth()->user()->username !== 'ryandhikapermana') {
abort(403);
}

>> Sekarang kalau kita refresh, maka user yang kita loginkan tersebut gk bisa
akses, karena
dashboard hanya bisa diakses oleh Ryan Dhika. Kita buka ke dashboard dlu, post
categories
kalau kita klik akan error, karena dia belum bisa ngakses kategori, tapi
masalahnya tulisan
di sidebarnya masih muncul

>> Sekarang kalau kita coba pakai user Ryan Dhika Permana, kalau kita klik menu
Post Category
maka akan tampil dan tidak error, karena dia admin jadi boleh ngakses ini.
Bahkan seleksi
kondisinya bisa kita gabungin dengan menggunakan or

>> Kalau dia udah login atau dia bukan ryandhikapermana kasih abort. Kita cek di
web browser
maka tampilannya akan sama. Bahkan kita juga bisa aja gk pake guest, ada cara
lain kita
bisa pakai check(). Kalau check ini ngecheck kalau user sudah login atau belum
Misal :
if (!auth()->check() || auth()->user()->username !== 'ryandhikapermana') {
abort(403);
}

>> Tapi kalau check itu menghasilkan true ketika dia sudah login. Kita pengennya
ketika dia
belum login. Makanya di depan pengecekan kita tambahkan ! (NOT). Kalau mau
pakai check
ada NOT nya kalau pakai guest() gk usah pakai not

>> Karena kalau guest() dia belum login, maka true. Tapi check() kebalikannya,
kalau dia sudah
login, true. Sekarang user gk bisa ngakses kalau dia bukan ryandhikapermana.
Tapi problemnya
adalah syntax tersebut kita harus copy ke setiap method

>> Gimana kalau misalnya kita pengen ganti adminnya jangan ryandhikapermana, tapi
user lain.
Maka harus di edit semua, jadi agak ribet. Cara mindahin syntax tersebut supaya
bisa dengan
mudah di semua tempat

>> Cara paling gampang, kita bikin syntax tersebut menjadi sebuah middleware
sendiri. Jadi
kita punya middleware sendiri yang bisa kita tambahkan di route dengan nama
yang kita
bikin sendiri sehingga kalau kita tambahkan middleware di routenya, artinya
semua yang
ada di dalam url categories sudah langsung memiliki perilaku yang sama

>> Karena dia pakai middleware di keseluruhannya. Caranya kita bisa bikin
middleware menggunakan
artisan. Jadi kalau kita ketik di terminal php artisan make middleware
namaMiddleware, atau
karena kita sudah punya extension vscodenya, kita bisa gunakan command palette

>> Ketik make middleware, kalau kita tekan enter, nama middlewarenya mau apa, kita
kasih
nama middlewarenya IsAdmin, namanya bisa bebas aja. Lalu tekan enter maka
otomatis akan
dibikinin langsung di dalam folder middleware sebuah class yang namanya IsAdmin

>> Sekarang kita buka filenya, kita akan masukkin logicnya di dalam method handle,

kita tulisnya sebelum return. Jadi kita akan bikin logic kita, setelah itu
jalanakan
middleware berikutnya. Yang namanya middleware itu pasti berada di antara
bagian2 lain

>> Yang kita taro di dalam method handle adalah persis dengan syntax yang kita
tulis di method
index, jadi kita bisa cut dan pindahkan di method handle di file middleware
kita
Misal :
public function handle(Request $request, Closure $next)
{
if (!auth()->check() || auth()->user()->username !== 'ryandhikapermana') {
abort(403);
}
return $next($request);
}

>> Jadi kita sudah punya middlewarenya, dan kalau kita tambahkan di route, maka
middlewarenya
belum jalan, karena kita belum tahu nama middlewarenya apa. Kita baru punya
class middlewarenya
cara menjalankan middleware kita, kita harus masukin juga ke dalam kernelnya

>> Jadi kita masuk ke dalam file Kernel.php, supaya middleware kita di daftarin.
Kalau kita
lihat di dalam filenya. Kita punya namanya global middleware. Middleware yang
otomatis
jalan ketika laravelnya jalan

>> Tapi kita juga punya kalau kita scroll kebawah itu ada yang namanya application
route
middleware. Jadi middleware ini bisa kita kasih ke group atau ke route
individualnya
satu2. Ini sudah ada semua middleware yang bisa kita pakai, kecuali middleware
kita

>> Jadi kita harus daftarin dengan cara memberi namanya dlu, namanya mau apa, kita
kasih
nama admin, namanya bebas. Lalu kita arahkan ke classnya. Karena class kita ada
di dalam
folder middleware. Kita harus tulis namespacenya

>> Jadi kita tulis \App\Http\Middleware\IsAdmin, kita copas namespace yang sama.
Lalu kita
ubah namanya. Jika sudah kita save, kita buka web lalu kita kasih di route
Misal :
'admin' => \App\Http\Middleware\IsAdmin::class

Route::resource('/dashboard/categories', AdminCategoryController::class)-
>except('show')->middleware('admin');

>> Kita coba di browser, kalau kita refresh maka tampilannya tidak error, karena
kita login
sebagai admin. Kalau kita login pakai user lain, di dashboard, masih ada menu
Post Categoriesnya
kalau kita klik, maka forbidden

>> Jadi sekarang sudah lebih gampang, kita simpan sebagai middleware kita sendiri.
Jadi gk perlu
lagi kita copykan, syntaxnya ke tiap2 method di dalam controller category.
Sekarang yang
akan kita lakukan adalah menghilangkan tulisan Post Categories di dalam sidebar

>> Kalau dia bukan admin. Caranya, kita baru membutuhkan fitur otorisasi
menggunakan gate()
karena gate lebih fleksibel dibanding kita menggunakan middleware karena kalau
middleware
gampang sebenernya

>> Kita tinggal kasih di route kita, langsung semuanya gk bisa diakses kalau bukan
admin. Tapi
yang kita inginkan adalah sebagian kecil dari view kita, kita akan beri kondisi
di sidebar
bagian Post Categories hanya boleh tampil kalau usernya admin, kalau pakai
middleware
gk bisa sefleksibel itu

>> Coba kita cek di dokumentasi laravel gimana cara bikin gate(), bagaimana cara
menulis
sebuah gate, Gates adalah sebuah cara yang bagus untuk mempelajari dasar2 dari
otorisasi
laravel. Meskipun kalau kita bikin aplikasinya cukup kompleks, kita harus
memikirkan juga
untuk menggunakan policies

>> Supaya aturan otorisasi kita lebih terorganisir lagi. Jadi kalau mau kompleks
pakai policies
ada banyak seperti moderator, author, admin, superAdmin, kalau udah banyak kita
butuh policies
cara bikin gate adalah, kita cukup bikin closures atau function untuk
menentukan apakah
user memiliki akses untuk melakukan aksi tertentu
>> Umumnya gates didefinisikan di dalam method boot di file AuthServiceProvider
yang ada di
dalam folder app/Providers, nanti kita bikin facade yang namanya gate. Gate ini
selalu
menerima instance user sebagai argumen pertamanya. Jadi otomatis tau user yang
lagi login
siapa

>> Sehingga kita bisa kasih user tersebut bisa ngapain aja. Bisa juga kita
tambahin argumen
tambahan contohnya adalah model yang relevan. Contoh di dalam file
AuthServiceProvider
ada yang namanya boot

>> Di boot() kita bikin Gate::define, kita mendefinisikan pagar baru, yang namanya
apa, lalu
beri closure, lalu yang boleh ngakses itu siapa, parameter di closuresnya
adalah user,
dan parameter kedua model yang dibutuhin

>> Jadi kita tulis Gate::define() lalu nama gatenya, kita bisa kasih namanya -
aksi, misalnya
create-category, dll, kalau semua bisa dilakukan oleh user yang sama, misalnya
admin,
yaudah bikin satu, namanya admin, atau is-admin

>> Jangan lupa di atas filenya kita kasih includekan facade, dan karena kita pakai
model user
dan model post, maka kita tulis namespacenya. Sekarang kita buka file sidebar,
kita masuk
ke folder App\Providers lalu ke file AppServiceProvider

>> Kalau kita scroll filenya kita ada method yang namanya boot, di dalamnya kita
sudah bikin
agar pagination kita menggunakan templatenya bootstrap. Tapi sekarang kita akan
tulis
sesuatu di dalamnya kita bikin gate, caranya kita panggil facadenya
Gate::define

>> Kita definisikan admin, aturan untuk seorang admin, lalu kita kasih closure
dengan mengetikkan
function, bisa menggunakan itu atau bisa menggunakan yang baru yaitu fn, lalu
di dalamnya
parameter pertamanya adalah model user, supaya tau siapa yang lagi login

>> Di dalam functionnya nanti kita kasih tau, sebenernya logicnya akan sama dengan
locig ketika
kita membuat middleware admin, tapi gk perlu pake pengecekan otentikasi, karena
udah
jelas gate untuk user yang udah login

>> Tinggal kita perluas lagi setelah dia login, dia bisa ngapain, jadi kalau dia
udah login
lalu usernamenya sama dengan username admin, bahkan karena kita udah tau user,
jadi kita
tinggal tulis variable user

>> Jadi kalau usernya sama dengan username admin ('ryandhikapermana'), kita kasih
return
Misal :
public function boot()
{
Paginator::useBootstrap();
Gate::define('admin', function (User $user) {
return $user->username == 'ryandhikapermana';
});
}

>> Jika sudah tulis, akan ada garis merah pada gate dan user, karena kita belum
include kan,
kita includekan di atas
Misal :
use Illuminate\Support\Facades\Gate;
use App\Models\User;

>> Sekarang kita akan definisikan sebuah gate yang namanya admin, dimana gate ini
hanya bisa
diakses gerbangnya oleh user yang usernamenya ryandhikapermana. Sekarang kita
jadi punya
cara lain untuk melakukan otorisasi.

>> Otorisasi yang pertama kita pake middleware, kelebihan middleware itu gampang
dipake ketika
kita mau ngasih otorisasi untuk banyak method sekaligus, kekurangannya adalah
dia gk
fleksibel, contohnya kalau kita gk pake middleware

>> Dan sekarang kita mau pakai gate, caranya kita balik ke
AdminCategoryController, sekarang
kita beri pengecekan di index, kalau tadi penecekkannya pake manual dengan
menggunakan
seleksi kondisi if, cek udah login atau belum, lalu cek usernya
ryandhikapermana atau
bukan

>> Sekarang kita ngeceknya pakai gate, cara ngeceknya adalah kita bisa tulis
variable this
authorize(), lalu di dalamnya kita kasih nama gatenya, yaitu admin. Jadi kita
hanya bisa
mengakses viewnya kalau dia sudah login dan dia admin
Misal :
public function index()
{
$this->authorize('admin');
return view('dashboard.categories.index', [
'categories' => Category::all()
]);
}

>> Kita cek di browser, kita menggunakan user selain admin, jika kita refresh,
maka tampilannya
gk ada perubahan, kita lakukan logout, kemudian login lagi pakai user selain
admin, ketika
kita klik menu Post Category, maka errornya adalah 403 this action is
unauthorized

>> Jadi ini bisa, kalau kita mau pakai gate, kelebihannya adalah, misalnya kita
hapus syntax
this tadi, lalu kita kasih middleware di route, middleware biarkan digunakan
untuk mengelola
semua method kita, sekarang kelebihan dari gate adalah kita bisa pakai
dimanapun

>> Kalau kita gunakan di sidebar, kita ingin baris untuk menampilkan menu Post
Categories
hanya muncul ketika yang login adalah admin, caranya kita tinggal panggil blade
directives
yang namanya @can(), lalu tutup dengan @endcan

>> Jadi baris ini hanya bisa diakses oleh di dalamnya kita kasih yang punya akses
di gerbang
mana, tadi kita sudah buat nama gerbangnya adalah admin.
Misal :
@can('admin')
<h6 class="sidebar-heading d-flex justify-content-between
align-items-center px-3 mt-4 mb-1 text-muted">
<span>Administrator</span>
</h6>
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link {{ Request::
is('dashboard/categories*') ? 'active' : '' }}" aria-current="page"
href="/dashboard/categories">
<span data-feather="grid"></span>
Post Categories
</a>
</li>
</ul>
@endcan

>> Jadi kita gabungin, middleware kita pakai di route, gatenya kita pakai di
bladenya.
Jika kita refresh, maka menu Post Categories tidak muncul di user yang bukan
admin, dan
kalaupun usernya tau urlnya, gk bisa juga

>> Kalau yang loginnya admin, maka tampilan menu Post Categories ada. Gimana kalau
adminnya
nambah, gimana kalau kita ingin supaya, user lain menjadi admin, caranya
sebenarnya kita
bisa tambahkan logic lagi di middlewarenya

>> Kalau misalnya adminnya nambah atau berubah, kita repot harus ngedit2 di
middleware dan
ngedit2 di gatenya juga, gimana kalau misalnya kita ubah rancangan aplikasi
kita supaya nanti
laravel ngecek otorisasinya lewat field di dalam tabel kita

>> Misalnya kita akan tambahkan field baru namanya isAdmin, di tabel user yang
tipenya boolean
kalau true, dia admin, kalau false dia user biasa. caranya kita bisa lewat
migrasi. Tapi
sayang banget migrasi yang sudah kita bikin sudah banyak

>> Daripada kita ubah2, kalau kita ke migrasi, kita sudah punya migrasi user,
daripada kita
edit lagi trus kita migrate fresh lagi, mendingan kita sisipkan satu field baru
tapi lewat
migrasi tambahan

>> Kita bikin migrasi baru dengan menggunakan command palette, kita bikin migrasi
baru, kalau
kita bikin tabel baru itu nulisnya create, lalu nama tabelnya apa. Karena kita
mau menyisipkan
kita tulisnya add_is_admin, jadi kita mau nambahin field baru yang namanya
is_admin _to
ke tabel mana _users_table

>> Jadi kita mau tambahin ini, jika kita enter, maka ad pertanyaan apakah migrasi
ini membuat
tabel baru, kita klik no, apakah migrasi ini memodifikasi tabel yang sudah ada,
klik yes,
apa tabelnya, kita ketikkan nama tabelnya users
Misal :
add_is_admin_to_users_table

>> Jika kita buka filenya, sekarang tabelnya sudah masuk yang mau kita
modifikasinya di method
up(), tinggal kita sisipkan apa yang mau ditambahin, kita ingin menambahkan di
dalam
tabelnya sebuah field yang tipe datanya boolean yang nama fieldnya is_admin
kita kasih
nilai defaultnya false
Misal :
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->boolean('is_admin')->default(false);
});
}

>> Jadi defaultnya bukan admin, kalau jadi admin kita akan edit manual lewat
databasenya,
untuk method down() digunakan untuk menghapus field is_adminnya, siapa tau
butuh rollback
kita harus kasih juga $table->dropColumn('is_admin');
Misal :
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('is_admin');
});
}

>> Jadi kita sudah punya migrasinya, sekarang tinggal kita jalankan migrasinya di
terminal
dengan mengetikkan php artisan migrate, ini akan menjalankan migrasi yang belum
dijalankan
saja, jadi gk akan ngeganggu tabel yang lain

>> Hanya akan ngedit tabel users dan mengubah semua isinya yang tadinya gk ada
is_admin jadi ada
Kalau kita lihat di database, ketika kita refresh, maka ada field is_admin, dan
kerennya
semua user kita sudah dikasih is_admin yang nilai defaultnya false
>> Kita akan jadikan ryan dhika sebagai admin, caranya kita lakukan di database
klik nilai
dari is_adminnya jadi 1, tapi enaknya kalau kita nyisipin seperti itu, kalau gk
jadi
nambahin is_adminnya, kita tinggal rollback aja

>> Jadi nanti field is_adminnya akan hilang, tapi kita biarkan saja seperti itu.
Implementasinya
kita tinggal ganti logicnya gk lagi username == 'ryandhikapermana', tapi kita
tinggal tulis
$user->is_admin, jadi kalau ini nilainya true, dia akan ngecek field
is_adminnya nilainya
0 atau 1
Misal :
public function boot()
{
Paginator::useBootstrap();
Gate::define('admin', function (User $user) {
return $user->is_admin;
});
}

>> Maka gerbangnya bisa diakses ketika true, jangan lupa kita tulis di
middlewarenya juga, tapi
hati2 untuk middleware itu kalau dia bukan admin, jadi kita kasih not di method
auth()
Misal :
if (!auth()->check() || !auth()->user()->is_admin) {
abort(403);
}

>> Sekarang kita coba di browser, maka ryandhika bisa ngakses, kalau kita login
dengan user
lain, maka gk ada menu Post Categoriesnya, tapi gimana kalau kita mau ngasih
user lain
sebagai admin, kita tinggal edit di database, nilai is_admin jadi 1

>> Kalau ingin otorisasinya lebih kompleks, kita gunakan policies

Anda mungkin juga menyukai