D
Engineering

Authentication & Permission

Sistem auth Admin Dazo — guard admin, Sanctum token, dan custom permission model.

Guard & Provider

Admin Dazo menggunakan 2 guard yang terpisah dari dazoapp:

GuardDriverProviderKegunaan
web (default)sessionadminsDefault Laravel guard
adminsessionadminsWeb admin panel (dipakai di AuthenticateAdmin middleware)

Model auth: App\Models\Admin — MongoDB collection admins, menggunakan MongoDB\Laravel\Auth\User (bukan Eloquent standar).

Login Flow

  1. Admin mengakses /login → AdminController::showLoginForm()
  2. Jika belum ada admin sama sekali → auto-create superadmin (superadmin@gmail.com / superadmin)
  3. Submit credentials → AdminController::login() → Auth::guard('admin')->attempt()
  4. Jika berhasil → redirect ke /admin/dashboard + issue Sanctum token (createToken('API Token'))
  5. Token disimpan via custom PersonalAccessToken (MongoDB, bukan MySQL)

Middleware

AuthenticateAdmin (app/Http/Middleware/AuthenticateAdmin.php):

php
if (!Auth::guard('admin')->check()) {
    return redirect()->route('admin.show.login');
}

Semua route admin di-wrap dalam middleware ini (routes/web.php:51).

Permission Model

Bukan Spatie — custom embedded permission di model Admin.

Field permission di dokumen admin:

json
{
  "permission": [
    { "name": "list user", "create": true, "read": true, "update": true, "delete": true },
    { "name": "list customer", "create": false, "read": true, "update": false, "delete": false }
  ]
}

Helper

findPermissionByName($user, $permissionName) di app/Helpers/helpers.php:

  • Jika $user->role === 'superadmin' → return full CRUD
  • Jika tidak → cari di array permission by name, return {create, read, update, delete}

Pattern di Controller

Setiap method di controller dimulai dengan:

php
$user = auth()->guard('admin')->user();
$permission = findPermissionByName($user, 'list user');
if (!$permission || !$permission->read) {
    return redirect()->route('accessdenied');
}

Pattern ini diulang di hampir setiap method — tidak menggunakan middleware atau policy.

API Authentication

Route API (routes/api.php) menggunakan auth:sanctum (Laravel Sanctum). Token dibuat saat login web via createToken('API Token').

Custom PersonalAccessToken model di-alias ke App\Models\PersonalAccessToken agar token tersimpan di MongoDB (bukan MySQL).

Bug: PersonalAccessToken::updated()

Di AdminController.php:56:

php
PersonalAccessToken::updated(...)  // Ini event method, bukan query

Seharusnya update() atau updateOrCreate(). Kode ini tidak berfungsi — silently does nothing.

Role

RoleAkses
superadminFull access — bypass semua permission check
LainnyaTerbatas sesuai array permission

Role disimpan sebagai string field role di dokumen Admin.