hak akses konsisten: sidebar Master Data pakai permission per-menu (+directive canAnyPermission); FIX direktif canPermission pakai canPermission() model (sebelumnya hanya role kolom — multi-role & user tanpa kolom role tidak dapat menu) + test

This commit is contained in:
Sari
2026-08-03 09:58:52 +07:00
parent 6dcb4c0619
commit 3bfad9cf42
3 changed files with 44 additions and 12 deletions
+15 -11
View File
@@ -4,7 +4,6 @@ namespace App\Providers;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
@@ -30,17 +29,22 @@ class AppServiceProvider extends ServiceProvider
if (! $user) {
return false;
}
if ($user->role === 'admin') {
return true;
return $user->canPermission($permission);
});
// Blade directive: @canAnyPermission('a', 'b', ...) — true jika user punya SALAH SATU permission
Blade::if('canAnyPermission', function (string ...$permissions) {
$user = auth()->user();
if (! $user) {
return false;
}
$rolePermissions = Cache::remember('role_permissions:' . $user->role, 3600, function () use ($user) {
return \DB::table('role_permissions')
->join('permissions', 'role_permissions.permission_id', '=', 'permissions.id')
->where('role_permissions.role', $user->role)
->pluck('permissions.key')
->toArray();
});
return in_array($permission, $rolePermissions);
foreach ($permissions as $permission) {
if ($user->canPermission($permission)) {
return true;
}
}
return false;
});
}
}
+7 -1
View File
@@ -171,17 +171,23 @@
<x-nav-item href="{{ route('reports.violations') }}" icon="file-lines" :active="request()->routeIs('reports.violations*')">Laporan</x-nav-item>
@endcanPermission
@canPermission('categories-manage')
@canAnyPermission('categories-manage', 'violation-types-manage', 'thresholds-manage', 'face-register')
<div class="pt-4 mt-4 border-t border-gray-200">
<p class="px-3 text-xs font-semibold text-gray-500 uppercase tracking-wider">Master Data</p>
</div>
@endcanAnyPermission
@canPermission('face-register')
<x-nav-item href="{{ route('face.register') }}" icon="user-plus" :active="request()->routeIs('face.register')">Registrasi Wajah</x-nav-item>
@endcanPermission
@canPermission('categories-manage')
<x-nav-item href="{{ route('settings.categories') }}" icon="tag" :active="request()->routeIs('settings.categories*')">Kategori Pelanggaran</x-nav-item>
@endcanPermission
@canPermission('violation-types-manage')
<x-nav-item href="{{ route('settings.violation-types') }}" icon="list" :active="request()->routeIs('settings.violation-types*')">Jenis Pelanggaran</x-nav-item>
<x-nav-item href="{{ route('settings.handling-types') }}" icon="hand-holding-heart" :active="request()->routeIs('settings.handling-types*')">Jenis Penanganan</x-nav-item>
<x-nav-item href="{{ route('settings.homeroom') }}" icon="chalkboard-user" :active="request()->routeIs('settings.homeroom*')">Wali Kelas</x-nav-item>
@endcanPermission
@canPermission('thresholds-manage')
<x-nav-item href="{{ route('settings.thresholds') }}" icon="chart-bar" :active="request()->routeIs('settings.thresholds*')">Ambang SP</x-nav-item>
@endcanPermission
@@ -52,4 +52,26 @@ class PermissionManagementTest extends TestCase
->assertSee('view-point-audit')
->assertSee('Khusus Admin');
}
public function test_menu_sidebar_mengikuti_permission_role(): void
{
// Role staff dengan akses dashboard + thresholds-manage SAJA
$staff = User::factory()->create(['roles' => ['staff']]);
$ids = DB::table('permissions')->whereIn('key', ['access-dashboard', 'thresholds-manage'])->pluck('id');
foreach ($ids as $pid) {
DB::table('role_permissions')->insert([
'role' => 'staff',
'permission_id' => $pid,
'created_at' => now(),
'updated_at' => now(),
]);
}
$this->actingAs($staff)
->get('/dashboard')
->assertOk()
->assertSee('Ambang SP')
->assertDontSee('Kategori Pelanggaran')
->assertDontSee('Sinkronisasi');
}
}