Owner, Guest),config/tenant_authz.phpenabledallow_unmapped_routespermissions (katalog permission)default_role_permissions (guest, member, dst)route_permissions (mapping route name ke permission)App\Http\Middleware\Tenant\Authz\EnforceTenantRoutePermissionApp\Services\Tenant\Authz\TenantRoutePermissionResolverApp\Services\Central\Auth\AuthorizationResolverApp\Http\Controllers\Api\V1\Tenant\Authz\RoleControllerApp\Services\Tenant\Authz\TenantRolePermissionServiceApp\Services\Tenant\Authz\TenantRoleLifecycleServiceDatabase\Seeders\RolePermissionSeederApp\Models\Tenant\Authorization\RoleHasPermissionApp\Models\Tenant\Authorization\ModelHasRoleApp\Models\Central\Authorization\RoleHasPermissionApp\Models\Central\Authorization\ModelHasRolegroup.resource.action)resource.action)manage implied untuk action non-manage.tenant_authz_permissions disimpan di request attributes untuk menghindari resolve berulang.AuthorizationResolver mengambil roles & permissions dari cluster tenant:model_has_roles + rolesmodel_has_permissions + permissionsmodel_has_roles + role_has_permissions + permissionsresolvePlatform), sumber data dari central RBAC.TenantRoutePermissionResolver bekerja dengan route name (bukan path literal):tenant.user.indextenant.billing.*index: list role + permission.store: buat role custom (is_system=false).update: dilarang untuk role system.destroy: dilarang untuk role system, lalu lifecycle delete via service.is_system)Guest system roleGuest untuk user terdampak yang tidak punya role lainGuest ada dan selalu is_system=trueis_system=trueis_system=truetenant_authz.default_role_permissions.guesttenant_authz.default_role_permissions.memberRolePermissionSeeder)tenant_authz.permissionsroute_permissionsdefault_role_permissions.memberdefault_role_permissions.guestOwner (system)Guest (system)Member (non-system)updateOrCreate + sync pattern).tenant_authz.permissions.tenant_authz.route_permissions.member/guest) bila perlu.GET /auth/me mengandung permission yang dibutuhkan.route_permissions?auth/me?tenant_authz.enabled bernilai true/false sesuai ekspektasi?allow_unmapped_routes tidak menutup endpoint baru?php artisan config:clear jika perlu).app/Http/Middleware/Tenant/Authz/EnforceTenantRoutePermission.phpapp/Services/Tenant/Authz/TenantRoutePermissionResolver.phpapp/Services/Central/Auth/AuthorizationResolver.phpapp/Services/Tenant/Authz/TenantRolePermissionService.phpapp/Services/Tenant/Authz/TenantRoleLifecycleService.phpapp/Http/Controllers/Api/V1/Tenant/Authz/RoleController.phpconfig/tenant_authz.phpdatabase/seeders/RolePermissionSeeder.phptests/Feature/Tenant/Authz/TenantRoutePermissionMiddlewareTest.phptests/Feature/Tenant/Authz/TenantRoleApiTest.phptests/Feature/Tenant/Identity/TenantUserApiTest.php