Cara Bikin Multi User Permission Dengan Laravel 11 dan Spatie

Pentingnya User Experience dalam Bisnis Online

User experience (UX) yang baik sangat penting untuk membuat pengguna betah menggunakan website. Ketika pengguna merasa nyaman dan senang saat menggunakan situs Anda, kemungkinan besar mereka akan kembali lagi dan berinteraksi lebih lama. Ini berarti peningkatan engagement dan pada akhirnya dapat meningkatkan bisnis online Anda.

Apa itu Multi User Permission pada Website?

Multi user permission adalah sistem yang memungkinkan berbagai pengguna untuk memiliki hak akses dan fitur yang berbeda-beda di dalam sebuah website. Misalnya, di sebuah situs e-commerce, admin dapat mengelola semua produk, sementara pelanggan hanya bisa melihat dan membeli produk. Penerapan sistem ini sangat penting untuk memastikan bahwa setiap pengguna memiliki akses sesuai dengan peran dan tanggung jawab mereka.

Mengapa Perlu Multi User Permission?

  • Keamanan: Mengurangi risiko akses tidak sah ke data sensitif.
  • Efisiensi: Mempermudah manajemen pengguna dengan memberikan akses sesuai kebutuhan.
  • Personalisasi: Meningkatkan UX dengan memberikan fitur yang relevan sesuai peran pengguna.

Apa itu Package Spatie dan Apakah Cocok Laravel 11?

Spatie Role Permission adalah package Laravel yang memungkinkan Anda untuk mengelola peran dan izin pengguna dengan mudah. Package ini sangat cocok untuk Laravel 11 karena terus diperbarui dan didukung oleh komunitas yang aktif.

Manfaat Spatie Role Permission:

  1. Implementasi Cepat: Tidak perlu membuat sistem permission dari awal.
  2. Keamanan: Sudah diuji oleh banyak developer dan memiliki fitur keamanan yang andal.
  3. Fleksibilitas: Mudah disesuaikan dengan kebutuhan spesifik proyek Anda.

Contoh User Role Permission

1. E-commerce Website

Role: Admin, Vendor, Customer

Pada aplikasi e-commerce, peran (role) seperti Admin, Vendor, dan Customer sangat penting untuk membedakan hak akses dan tindakan yang bisa dilakukan oleh masing-masing pengguna.

Admin

Admin memiliki akses penuh untuk mengelola seluruh data website, termasuk mengelola produk, pesanan, dan pengguna.

Contoh Koding:

// Assign role to a user
$user = User::find(1);
$user->assignRole('admin');

// Check if user has a role
if ($user->hasRole('admin')) {
    // Admin-specific access
    // Mengelola produk, pesanan, dan pengguna
}

// Check permission
if ($user->can('edit products')) {
    // Grant access to edit products
    // Code to edit products
}

// Create a new product
if ($user->can('create products')) {
    $product = new Product();
    $product->name = 'Product Name';
    $product->price = 100;
    $product->description = 'Product Description';
    $product->save();
}

Vendor

Vendor memiliki hak untuk menambahkan dan mengelola produk mereka sendiri. Mereka tidak bisa mengelola produk vendor lain atau mengakses fitur admin lainnya.

Contoh Koding:

// Assign role to a user
$user = User::find(2);
$user->assignRole('vendor');

// Check if user has a role
if ($user->hasRole('vendor')) {
    // Vendor-specific access
    // Menambahkan dan mengelola produk mereka sendiri
}

// Check permission
if ($user->can('add products')) {
    // Grant access to add products
    // Code to add new products
}

// Create a new product by Vendor
if ($user->can('create products')) {
    $product = new Product();
    $product->name = 'Vendor Product';
    $product->price = 50;
    $product->description = 'Vendor Product Description';
    $product->vendor_id = $user->id;
    $product->save();
}

// Manage Vendor's products
$vendorProducts = Product::where('vendor_id', $user->id)->get();
foreach ($vendorProducts as $product) {
    // Perform some action with each product
}

Customer

Customer hanya memiliki akses untuk melihat dan membeli produk. Mereka tidak memiliki hak untuk mengelola data data produk atau pengguna lain.

Contoh Koding:

// Assign role to a user
$user = User::find(3);
$user->assignRole('customer');

// Check if user has a role
if ($user->hasRole('customer')) {
    // Customer-specific access
    // Melihat dan membeli produk
}

// Check permission
if ($user->can('view products')) {
    // Grant access to view products
    // Code to display products
}

// Customer adding a product to cart
if ($user->can('add to cart')) {
    $cart = Cart::firstOrCreate(['user_id' => $user->id]);
    $cart->products()->attach($product->id, ['quantity' => 1]);
}

// View cart contents
$cartContents = Cart::where('user_id', $user->id)->with('products')->get();
foreach ($cartContents as $item) {
    // Display item details
}

Dengan contoh-contoh koding di atas, Anda bisa melihat bagaimana peran dan izin diterapkan dalam aplikasi e-commerce menggunakan Laravel dan Spatie Role Permission. Setiap peran memiliki hak akses dan tindakan yang spesifik sesuai dengan kebutuhannya, yang membantu dalam mengelola dan mengamankan aplikasi secara efektif.

2. Blog Platform

Role: Admin, Editor, Author, Subscriber

Pada platform blog, peran seperti Admin, Editor, Author, dan Subscriber memungkinkan manajemen konten yang efisien dan terstruktur.

Admin

Admin memiliki akses penuh untuk mengelola semua konten dan pengguna di platform blog.

Contoh Koding:

// Assign role to a user
$user = User::find(1);
$user->assignRole('admin');

// Check if user has a role
if ($user->hasRole('admin')) {
    // Admin-specific access
    // Mengelola semua konten dan pengguna
}

// Check permission
if ($user->can('publish articles')) {
    // Grant access to publish articles
    // Code to publish articles
}

// Create a new article
if ($user->can('create articles')) {
    $article = new Article();
    $article->title = 'New Article Title';
    $article->content = 'Content of the new article';
    $article->user_id = $user->id;
    $article->save();
}

Editor

Editor memiliki hak untuk mengedit dan mengelola artikel yang dibuat oleh penulis, serta mengatur publikasi artikel.

Contoh Koding:

// Assign role to a user
$user = User::find(2);
$user->assignRole('editor');

// Check if user has a role
if ($user->hasRole('editor')) {
    // Editor-specific access
    // Mengedit dan mengelola artikel
}

// Check permission
if ($user->can('edit articles')) {
    // Grant access to edit articles
    // Code to edit articles
}

// Edit an article
if ($user->can('edit articles')) {
    $article = Article::find(1);
    $article->title = 'Updated Article Title';
    $article->content = 'Updated content of the article';
    $article->save();
}

// Approve an article for publishing
if ($user->can('approve articles')) {
    $article = Article::find(1);
    $article->status = 'approved';
    $article->save();
}

Author

Author memiliki hak untuk membuat dan mengelola artikel mereka sendiri, namun tidak bisa mempublikasikan artikel secara langsung.

Contoh Koding:

// Assign role to a user
$user = User::find(3);
$user->assignRole('author');

// Check if user has a role
if ($user->hasRole('author')) {
    // Author-specific access
    // Membuat dan mengelola artikel sendiri
}

// Check permission
if ($user->can('create articles')) {
    // Grant access to create articles
    // Code to create articles
}

// Create a new article
if ($user->can('create articles')) {
    $article = new Article();
    $article->title = 'Author Article Title';
    $article->content = 'Content of the author article';
    $article->user_id = $user->id;
    $article->status = 'draft';
    $article->save();
}

// Manage author's own articles
$authorArticles = Article::where('user_id', $user->id)->get();
foreach ($authorArticles as $article) {
    // Perform some action with each article
}

Subscriber

Subscriber hanya memiliki hak untuk membaca artikel yang dipublikasikan. Mereka tidak memiliki hak untuk membuat atau mengedit artikel.

Contoh Koding:

// Assign role to a user
$user = User::find(4);
$user->assignRole('subscriber');

// Check if user has a role
if ($user->hasRole('subscriber')) {
    // Subscriber-specific access
    // Membaca artikel yang dipublikasikan
}

// Check permission
if ($user->can('view articles')) {
    // Grant access to view articles
    // Code to display articles
}

// View published articles
$publishedArticles = Article::where('status', 'published')->get();
foreach ($publishedArticles as $article) {
    // Display article details
}

Dengan contoh-contoh koding di atas, Anda bisa melihat bagaimana peran dan izin diterapkan dalam platform blog menggunakan Laravel dan Spatie Role Permission. Setiap peran memiliki hak akses dan tindakan yang spesifik sesuai dengan kebutuhannya, yang membantu dalam mengelola dan mengamankan aplikasi secara efektif.

Latihan Bikin Multi User Permission pada Website LMS

Berikut adalah latihan untuk membuat sistem multi user permission pada proyek website Learning Management System (LMS) menggunakan Laravel 11 dan Spatie.

Langkah-Langkah

Instalasi Laravel dan Spatie Role Permission:

composer create-project --prefer-dist laravel/laravel lms
cd lms
composer require spatie/laravel-permission

Publish dan Migrasi:

php artisan vendor:publish --provider="Spatie\\\\Permission\\\\PermissionServiceProvider"
php artisan migrate

Atur di Model User:

use Spatie\\\\Permission\\\\Traits\\\\HasRoles;

class User extends Authenticatable
{
    use HasRoles;
}

Buat Role dan Permission:

use Spatie\\\\Permission\\\\Models\\\\Role;
use Spatie\\\\Permission\\\\Models\\\\Permission;

Role::create(['name' => 'admin']);
Role::create(['name' => 'instructor']);
Role::create(['name' => 'student']);

Permission::create(['name' => 'create courses']);
Permission::create(['name' => 'view courses']);
Permission::create(['name' => 'enroll courses']);

Assign Role dan Permission:

$user = User::find(1);
$user->assignRole('admin');

$role = Role::findByName('instructor');
$role->givePermissionTo('create courses');

Middleware untuk Akses Kontrol:

Tambahkan middleware di app/Http/Kernel.php:

protected $routeMiddleware = [
    // ...
    'role' => \\\\Spatie\\\\Permission\\\\Middlewares\\\\RoleMiddleware::class,
    'permission' => \\\\Spatie\\\\Permission\\\\Middlewares\\\\PermissionMiddleware::class,
];

Gunakan middleware di routes:

Route::group(['middleware' => ['role:admin']], function () {
    Route::get('/admin/dashboard', 'AdminController@dashboard');
});

Route::group(['middleware' => ['permission:create courses']], function () {
    Route::get('/instructor/create-course', 'InstructorController@createCourse');
});

3 Tips Membuat Multi User dengan Spatie Role Permission

Menggunakan Spatie Role Permission di Laravel mempermudah implementasi multi user permission. Berikut adalah tiga tips penting untuk melakukannya dengan efektif:

1. Rencanakan Struktur Role dan Permission dengan Baik

Sebelum mulai mengimplementasikan, pastikan Anda merencanakan struktur role dan permission sesuai dengan kebutuhan aplikasi Anda. Identifikasi peran utama pengguna dan hak akses apa yang diperlukan oleh setiap peran.

Detail:

  • Identifikasi Role: Tentukan peran-peran seperti Admin, Editor, User, dan sebagainya.
  • Tentukan Permission: Daftar tindakan yang diizinkan untuk setiap peran, seperti create, edit, delete, dan view.
  • Hierarki Role: Jika diperlukan, buat hierarki peran untuk mengatur izin yang lebih kompleks.

Contoh Koding:

use Spatie\\\\Permission\\\\Models\\\\Role;
use Spatie\\\\Permission\\\\Models\\\\Permission;

$adminRole = Role::create(['name' => 'admin']);
$editorRole = Role::create(['name' => 'editor']);
$userRole = Role::create(['name' => 'user']);

$permissions = ['create articles', 'edit articles', 'delete articles', 'view articles'];
foreach ($permissions as $permission) {
    Permission::create(['name' => $permission]);
}

$adminRole->givePermissionTo(Permission::all());
$editorRole->givePermissionTo(['create articles', 'edit articles', 'view articles']);
$userRole->givePermissionTo('view articles');

2. Gunakan Middleware untuk Mengontrol Akses

Laravel memungkinkan Anda menggunakan middleware untuk mengontrol akses berdasarkan role dan permission. Middleware ini memastikan bahwa hanya pengguna yang memiliki izin tertentu yang dapat mengakses rute atau mengakses fungsi tertentu.

Detail:

  • Middleware Role: Middleware untuk memastikan pengguna memiliki peran tertentu.
  • Middleware Permission: Middleware untuk memverifikasi bahwa pengguna memiliki izin spesifik.
  • Custom Middleware: Buat middleware khusus jika Anda memerlukan kontrol akses yang lebih kompleks.

Contoh Koding:

// Kernel.php
protected $routeMiddleware = [
    'role' => \\\\Spatie\\\\Permission\\\\Middlewares\\\\RoleMiddleware::class,
    'permission' => \\\\Spatie\\\\Permission\\\\Middlewares\\\\PermissionMiddleware::class,
];

// Web.php
Route::group(['middleware' => ['role:admin']], function () {
    Route::get('/admin/dashboard', 'AdminController@dashboard');
});

Route::group(['middleware' => ['permission:create articles']], function () {
    Route::get('/articles/create', 'ArticleController@create');
    Route::post('/articles', 'ArticleController@store');
});

3. Manage Role dan Permission melalui Panel Admin

Memiliki panel admin untuk mengelola role dan permission akan mempermudah pengaturan dan pemeliharaan aplikasi. Anda dapat membuat interface untuk menambah, mengedit, dan menghapus role dan permission tanpa harus mengubah kode secara manual.

Detail:

  • Form Role dan Permission: Buat form untuk menambah atau mengedit role dan permission.
  • Tabel Pengguna: Tampilkan daftar pengguna beserta peran dan izin mereka.
  • Bulk Actions: Sediakan opsi untuk memberikan atau mencabut peran dan izin secara massal.

Contoh Koding:

// AdminController.php
public function createRole(Request $request)
{
    $role = Role::create(['name' => $request->name]);
    $role->syncPermissions($request->permissions);
    return redirect()->back()->with('success', 'Role created successfully!');
}

public function createPermission(Request $request)
{
    $permission = Permission::create(['name' => $request->name]);
    return redirect()->back()->with('success', 'Permission created successfully!');
}

// create_role.blade.php
<form action="{{ route('admin.createRole') }}" method="POST">
    @csrf
    <input type="text" name="name" placeholder="Role Name" required>
    <select multiple name="permissions[]">
        @foreach($permissions as $permission)
            <option value="{{ $permission->id }}">{{ $permission->name }}</option>
        @endforeach
    </select>
    <button type="submit">Create Role</button>
</form>

Penutup dan Saran

Mengimplementasikan multi user permission dengan Spatie Role Permission di Laravel adalah langkah bijak untuk meningkatkan keamanan dan efisiensi aplikasi Anda. Dengan mengikuti panduan ini, Anda dapat dengan mudah mengatur peran dan izin pengguna untuk memastikan hanya pengguna yang berwenang yang dapat mengakses fitur tertentu.

Saran untuk Programmer Website

Agar lebih aman dan terstruktur dalam menggunakan Spatie Role Permission, berikut beberapa saran yang bisa Anda terapkan:

  • Selalu Perbarui Package Spatie: Pastikan Anda selalu menggunakan versi terbaru dari Spatie Role Permission untuk mendapatkan fitur terbaru dan perbaikan keamanan.
  • Gunakan Middleware dengan Bijak: Gunakan middleware untuk mengontrol akses ke rute tertentu, memastikan hanya pengguna yang berwenang yang dapat mengakses fitur-fitur penting.
  • Audit Akses Secara Berkala: Lakukan audit akses secara berkala untuk memastikan bahwa izin yang diberikan masih relevan dan sesuai dengan kebutuhan pengguna.

Belajar dari Mentor Expert di BuildWithAngga

Untuk meningkatkan keterampilan Anda dalam menggunakan Laravel dan Spatie Role Permission, Anda bisa belajar dari mentor expert di BuildWithAngga. Berikut beberapa benefit yang bisa Anda dapatkan:

  • Akses Seumur Hidup: Mendapatkan akses seumur hidup ke materi kelas yang berkualitas.
  • Portofolio Kuat: Membantu Anda membangun portofolio yang kuat untuk meningkatkan peluang kerja.
  • Support Komprehensif: Mendapatkan support dan bimbingan dari mentor yang berpengalaman.
  • Update Materi Berkala: Materi kelas yang selalu diperbarui sesuai dengan perkembangan teknologi terbaru.
  • Komunitas Belajar: Bergabung dengan komunitas belajar yang aktif untuk berbagi pengetahuan dan pengalaman.

Dengan mengikuti saran-saran di atas dan memanfaatkan manfaat belajar dari BuildWithAngga, Anda bisa menjadi developer yang lebih kompeten dan siap menghadapi tantangan dalam mengembangkan aplikasi web yang aman dan efisien.