Langkah-langkah untuk membuat project dengan Laravel :
1. Install xampp atau Laragon
2. Install Composer dan arahkan folder php ke folder php yang ada di xampp / Laragon
3. Install Laravel menggunakan Command Prompt :
composer create-project laravel/laravel TestProject
Jika ingin install Laravel dengan versi 8 gunakan command berikut ini :
composer create-project laravel/laravel="^8.0" TestProject
Apabila projek laravel sudah siap, kita lanjutkan ke langkah selanjutnya.
Install Auth Scaffolding
Ada dua package yang akan kita coba gunakan, yaitu laravel ui untuk auth scaffolding dan spatie laravel-permission untuk handle role dan permission. Untuk menginstall laravel ui, buka kembali terminal, lalu kita run command ini.
composer require laravel/ui --dev
Setelah proses instalasi selesai, run command di bawah ini untuk menggunakan bootstrap UI di auth scaffolding yang akan kita gunakan.
php artisan ui bootstrap --auth
Setelah auth scaffolding terinstall, selanjutnya kita install dependensi dan compile asset untuk user interface auth scaffolding aplikasi kita.
npm install && npm run dev
Kita tunggu sebentar sampai js dan css berhasil di-compile. Install laravel permissionLangkah selanjutnya adalah menginstall package spatie laravel permission. Buka kembali terminal, lalu kita run command di bawah ini. composer require spatie/laravel-permission
Selanjutnya kita publish spatie laravel-permission menggunakan command di bawah ini.
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
Kita bisa lihat ada file migration baru untuk table permissions dan role dari package spatie laravel-permission. Selanjutnya kita run migration.
php artisan migrate
Setelah kita run migration, kita bisa lihat ada beberapa table baru dari package ini dan juga table users di database. Penggunaan
Untuk menggunakan spatie laravel-permission, kita bisa menambahkan trait Spatie\Permission\Traits\HasRoles ke dalam User model. Buka app/Models/User.php, lalu kita tambahkan statement use di dalam class User model.
<?php
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;
// ... baris kode lainnya...
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
use HasRoles;
// ... baris kode lainnya...
}
Package ini memungkinkan users berelasi dengan permissions dan juga roles. Setiap role berelasi dengan multiple permission.
Menambahkan Permissions
Langkah selanjutnya adalah menambahkan beberapa permission dan juga role dengan menggunakan database seeder sesuai dengan yang sudah kita bahas sebelumnya. Buka kembali terminal, lalu kita run command untuk membuat seeder.
php artisan make:seeder PermissionDemoSeeder
Setelah PermissionDemoSeeder dibuat, selanjutnya buka file database/seeders/PermissionDemoSeeder.php. Lalu kita ketik kode berikut ini.
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;
class PermissionDemoSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// reset cahced roles and permission
app()[PermissionRegistrar::class]->forgetCachedPermissions();
// create permissions
Permission::create(['name' => 'view posts']);
Permission::create(['name' => 'create posts']);
Permission::create(['name' => 'edit posts']);
Permission::create(['name' => 'delete posts']);
Permission::create(['name' => 'publish posts']);
Permission::create(['name' => 'unpublish posts']);
//create roles and assign existing permissions
$writerRole = Role::create(['name' => 'writer']);
$writerRole->givePermissionTo('view posts');
$writerRole->givePermissionTo('create posts');
$writerRole->givePermissionTo('edit posts');
$writerRole->givePermissionTo('delete posts');
$adminRole = Role::create(['name' => 'admin']);
$adminRole->givePermissionTo('view posts');
$adminRole->givePermissionTo('create posts');
$adminRole->givePermissionTo('edit posts');
$adminRole->givePermissionTo('delete posts');
$adminRole->givePermissionTo('publish posts');
$adminRole->givePermissionTo('unpublish posts');
$superadminRole = Role::create(['name' => 'super-admin']);
// gets all permissions via Gate::before rule
// create demo users
$user = User::factory()->create([
'name' => 'Example user',
'email' => 'writer@qadrlabs.com',
'password' => bcrypt('12345678')
]);
$user->assignRole($writerRole);
$user = User::factory()->create([
'name' => 'Example admin user',
'email' => 'admin@qadrlabs.com',
'password' => bcrypt('12345678')
]);
$user->assignRole($adminRole);
$user = User::factory()->create([
'name' => 'Example superadmin user',
'email' => 'superadmin@qadrlabs.com',
'password' => bcrypt('12345678')
]);
$user->assignRole($superadminRole);
}
}
Di dalam method run() dari class PermissionDemoSeeder, kita menambahkan tiga tahapan proses, yaitu
Mendefinisikan permission sesuai dengan studi kasus yaitu operasi crud dan operasi untuk publish atau unpublish post,
Mendefinisikan role writer, admin dan superadmin, lalu menambahkan permission untuk masing-masing role
dan membuat demo user dengan rolenya masing-masing.
Selanjutnya kita re-migrate dan juga run seeder.
php artisan migrate:fresh --seed --seeder=PermissionDemoSeeder
Atau cukup jalankan PermissionDemoSeeder saja dengan menggunakan perintah berikut ini : php artisan db:seed --class=PermissionDemoSeeder Setelah command di atas kita run, kita bisa lihat sample data untuk permissions, roles dan juga users.
Grant akses Super Admin
Di class PermissionDemoSeeder, kita menambahkan role super-admin dan di dalamnya kita belum mendefinisikan permission untuk role tersebut. Di sini kita akan coba memberikan akses super admin melalui gate di dalam AuthServiceProvider. Buka file app/Providers/AuthServiceProvider.php, lalu kita modifikasi method boot().
<?php
// ... baris kode lainnya ...
class AuthServiceProvider extends ServiceProvider
{
// ... baris kode lainnya ...
public function boot()
{
$this->registerPolicies();
// Implicitly grant "Super Admin" role all permission checks using can()
Gate::before(function ($user, $ability) {
if ($user->hasRole('super-admin')) {
return true;
}
});
}
}
Pada baris kode di atas, ketika super admin login ke dalam web, semua pengecekan permission yang memanggil function call() atau @can() akan bernilai true. Ya, super admin bebas mau melakukan apa saja.
Menggunakan permission middleware
Untuk menggunakan middleware dari spatie laravel-permission, kita harus mendefinisikan middleware-nya terlebih dahulu. Buka file app/Http/Kernel.php, lalu cek sekitar baris 56 terdapat $routeMiddleware, properties dari class Kernel. Kita tambahkan route middleware untuk role, permission dan role_or_permission dari spatie laravel-permission.
protected $routeMiddleware = [
// ...
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];
Di aplikasi studi kasus kita kali ini, terdapat 6 contoh permission untuk crud dan juga status publish. Kita tambahkan dulu action untuk publish dan unpublish di halaman daftar post. Buka file resources/views/posts/index.blade.php, lalu kita modifikasi bagian row untuk button actionnya.
<td class="text-center">
@can('edit posts', Post::class)
<a href="{{ route('post.edit', $post->id) }}" class="btn btn-sm btn-primary">EDIT</a>
@endcan
@can('delete posts', Post::class)
<form onsubmit="return confirm('Apakah Anda Yakin ?');" action="{{ route('post.destroy', $post->id) }}" method="POST">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-sm btn-danger">HAPUS</button>
</form>
@endcan
@can('publish posts', Post::class)
<form onsubmit="return confirm('Publish post ini?');" action="{{ route('post.publish', $post->id) }}" method="POST">
@csrf
@method('PUT')
<button type="submit" class="btn btn-sm btn-info">Publish</button>
</form>
@endcan
@can('unpublish posts', Post::class)
<form onsubmit="return confirm('Unpublish post ini?');" action="{{ route('post.unpublish', $post->id) }}" method="POST">
@csrf
@method('PUT')
<button type="submit" class="btn btn-sm btn-info">Unpublish</button>
</form>
@endcan
</td>
Pada baris kode di atas, kita menambahkan action untuk publish dan unpublish. Selain itu terdapat pengecekan permission menggunakan @can().
Selanjutnya kita tambahkan method sederhana untuk handle publish dan unpublish post. Buka app/Http/Controllers/PostController.php, lalu tambahkan dua method publish() dan unpublish() di dalam class PostController.
<?php
// ... baris kode lainnya ...
class PostController extends Controller
{
// ... baris kode lainnya ...
public function publish(int $id)
{
echo 'post berhasil dipublish';
}
public function unpublish(int $id)
{
echo 'post berhasil diunpublish';
}
}
Ya, actionnya cuma menampilkan keterangan saja, karena fokus tutorial ini membahas tentang permission jadi kita buat sederhana saja.
Selanjutnya kita tambahkan route untuk menangani action publish dan unpublish. Buka file routes/web.php, lalu tambahkan route baru.
Route::put('post/{id}/publish', [PostController::class, 'publish'])->name('post.publish');
Route::put('post/{id}/unpublish', [PostController::class, 'unpublish'])->name('post.unpublish');
Dan langkah terakhir adalah menambahkan permission middleware. Sebagai contoh kita akan coba menambahkan permission middleware ini di controller. Buka app/Http/Controllers/PostController.php, lalu kita tambahkan middleware di dalam constructor.
<?php
// ... baris kode lainnya ...
class PostController extends Controller
{
public function __construct()
{
$this->middleware('permission:view posts', ['only' => ['index']]);
$this->middleware('permission:create posts', ['only' => ['create', 'store']]);
$this->middleware('permission:edit posts', ['only' => ['edit', 'update']]);
$this->middleware('permission:delete posts', ['only' => ['destroy']]);
$this->middleware('permission:publish posts', ['only' => ['publish']]);
$this->middleware('permission:unpublish posts', ['only' => ['unpublish']]);
}
// ... baris kode lainnya ...
}
Kita menambahkan proteksi untuk masing-masing fitur sesuai dengan permissionnya. Alternatif lain, teman-teman dapat menambahkan middleware ini route.
Uji coba
Untuk menguji coba, kita run artisan command:
php artisan serve
Setelah itu buka project di browser dengan mengakses http://127.0.0.1:8000. Teman-teman bisa coba login menggunakan demo user untuk masing-masing role. Setelah itu coba akses halaman http://127.0.0.1:8000/post dengan role yang berbeda. Ref : https://www.itsolutionstuff.com/post/laravel-8-user-roles-and-permissions-tutorialexample.html |
Tuesday, September 20, 2022
Membuat Project dengan Laravel dan User Permissions
Share to your friends
This Is The Newest Post
Subscribe to:
Post Comments (Atom)
EmoticonEmoticon