1ab2eeccca
Un user avec des permissions sur le rôle RBAC « user » ne voyait rien : le
ROLE_USER legacy n'a aucun lien avec le RBAC et getEffectivePermissions() ne lit
que rbacRoles + permissions directes, alors qu'aucun user n'était rattaché au
rôle « user » (table user_role vide, jamais backfillée).
Backend
- DefaultUserRoleAssigner + UserDefaultRoleListener (prePersist) : tout nouvel
utilisateur est rattaché au rôle « user » sur tous les chemins de persistance.
- Commande app:assign-default-roles (backfill idempotent) + ajout au deploy.sh.
- AppFixtures : seed des rôles système avant la création des users.
Frontend (gating par permission au lieu de ROLE_ADMIN legacy)
- Nouveau middleware « permission » + augmentation PageMeta : definePageMeta
({ permission }) (string = requise, array = any), ROLE_ADMIN bypasse.
- Pages directory/reporting/admin gatées par permission ; SidebarFilter accepte
une liste de permissions (any) ; section admin sans gate de rôle.
- team-absences reste en ROLE_ADMIN (module Absence non RBAC-isé côté backend).
56 lines
3.6 KiB
PHP
56 lines
3.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* Définition de la sidebar (sections + items) — navigation GLOBALE uniquement.
|
|
* Filtrée par SidebarFilter :
|
|
* - `module` : route ajoutée à disabledRoutes si module inactif ;
|
|
* - `roles` : section ou item masqué si l'utilisateur n'a aucun des rôles listés (gate minimal) ;
|
|
* - `permission` : section ou item masqué si la permission effective absente (RBAC fin —
|
|
* `User::getEffectivePermissions()` ; ROLE_ADMIN bypasse via le voter, mais la
|
|
* sidebar évalue les permissions effectives réelles — combiner avec `roles` au besoin).
|
|
* Les items contextuels (Kanban/Groupes/Archives), feature-flag (Documents) et user-flag
|
|
* (Mes absences) restent rendus côté layout, hors de cet endpoint.
|
|
* Mail est déclaré ici UNIQUEMENT pour le gating module (disabledRoutes si module inactif) ;
|
|
* son rendu visuel + badge non-lus reste géré côté layout, qui filtre `/mail` de translatedSections
|
|
* pour éviter le doublon.
|
|
* Les labels sont des clés i18n (sidebar.<domaine>.<item>).
|
|
*/
|
|
return [
|
|
[
|
|
'label' => 'sidebar.general.section',
|
|
'icon' => 'mdi:view-dashboard-outline',
|
|
'items' => [
|
|
['label' => 'sidebar.general.dashboard', 'to' => '/', 'icon' => 'mdi:view-dashboard-outline'],
|
|
['label' => 'sidebar.general.myTasks', 'to' => '/my-tasks', 'icon' => 'mdi:clipboard-check-outline', 'module' => 'project-management', 'permission' => 'project-management.tasks.view'],
|
|
['label' => 'sidebar.general.projects', 'to' => '/projects', 'icon' => 'mdi:folder-outline', 'module' => 'project-management', 'permission' => 'project-management.projects.view'],
|
|
['label' => 'sidebar.general.timeTracking', 'to' => '/time-tracking', 'icon' => 'mdi:calendar-edit-outline', 'module' => 'time-tracking', 'permission' => 'time-tracking.entries.view'],
|
|
],
|
|
],
|
|
[
|
|
'label' => 'sidebar.tools.section',
|
|
'icon' => 'mdi:tools',
|
|
'items' => [
|
|
// Gating module uniquement : rendu visuel + badge non-lus gérés côté layout
|
|
// (filtré de translatedSections puis ré-injecté avec suffixe (N)).
|
|
['label' => 'sidebar.general.mail', 'to' => '/mail', 'icon' => 'mdi:email-outline', 'module' => 'mail'],
|
|
],
|
|
],
|
|
[
|
|
// Plus de gate de rôle au niveau section : chaque item porte sa propre
|
|
// permission (RBAC fin), alignée sur la sécurité backend et les middlewares
|
|
// de page. La section s'affiche dès qu'au moins un item est autorisé.
|
|
'label' => 'sidebar.admin.section',
|
|
'icon' => 'mdi:cog-outline',
|
|
'items' => [
|
|
// team-absences : le module Absence est encore gardé par ROLE_ADMIN côté
|
|
// backend (pas de permission absence.* câblée) → on reste sur un gate de rôle.
|
|
['label' => 'sidebar.admin.teamAbsences', 'to' => '/team-absences', 'icon' => 'mdi:calendar-account-outline', 'module' => 'absence', 'roles' => ['ROLE_ADMIN']],
|
|
['label' => 'sidebar.admin.directory', 'to' => '/directory', 'icon' => 'mdi:card-account-details-outline', 'module' => 'directory', 'permission' => ['directory.clients.view', 'directory.prospects.view', 'directory.providers.view']],
|
|
['label' => 'sidebar.admin.reporting', 'to' => '/reporting', 'icon' => 'mdi:chart-line', 'module' => 'reporting', 'permission' => 'reporting.view'],
|
|
['label' => 'sidebar.admin.administration', 'to' => '/admin', 'icon' => 'mdi:cog-outline', 'permission' => 'core.users.view'],
|
|
],
|
|
],
|
|
];
|