Rôles & Permissions
XetaSuite utilise Spatie Laravel-Permission avec le mode teams activé pour gérer les permissions par site.
Architecture
Section intitulée « Architecture »User ─┬─ Site 1 ─── Role: Admin ─── Permissions: [company.*, user.*, ...] │ ├─ Site 2 ─── Role: Manager ─── Permissions: [material.*, zone.*, ...] │ └─ Site 3 ─── Role: User ─── Permissions: [material.view, zone.view]Configuration
Section intitulée « Configuration »config/permission.php
Section intitulée « config/permission.php »'teams' => true,'team_foreign_key' => 'site_id',Assigner un rôle
Section intitulée « Assigner un rôle »// ⚠️ TOUJOURS définir le contexte du site AVANT l'assignationsetPermissionsTeamId($site->id);
// Assigner le rôle$user->assignRole('manager');
// Le rôle est enregistré avec site_id dans la table pivotVérifier les permissions
Section intitulée « Vérifier les permissions »Dans les Policies
Section intitulée « Dans les Policies »class CompanyPolicy{ public function view(User $user, Company $company): bool { // Vérifie la permission pour le site actuel return $user->can('company.view'); }}Dans les Controllers
Section intitulée « Dans les Controllers »public function index(Request $request){ // Via Gate $this->authorize('viewAny', Company::class);
// Ou directement if ($request->user()->can('company.viewAny')) { // ... }}Dans React
Section intitulée « Dans React »const { hasPermission, hasRole, hasAnyPermission } = useAuth();
// Permission unique{hasPermission('company.create') && <CreateButton />}
// Plusieurs permissions (OR){hasAnyPermission(['company.update', 'company.delete']) && <EditMenu />}
// Rôle{hasRole('admin') && <AdminPanel />}Permissions disponibles
Section intitulée « Permissions disponibles »Format standard
Section intitulée « Format standard »{resource}.{action}| Action | Description |
|---|---|
viewAny | Voir la liste |
view | Voir un élément |
create | Créer |
update | Modifier |
delete | Supprimer |
Par module
Section intitulée « Par module »| Module | Permissions |
|---|---|
| Sites | site.viewAny, site.view, site.create, site.update, site.delete |
| Zones | zone.viewAny, zone.view, zone.create, zone.update, zone.delete |
| Matériels | material.viewAny, material.view, material.create, material.update, material.delete, material.generateQrCode, material.scanQrCode |
| Maintenances | maintenance.viewAny, maintenance.view, maintenance.create, maintenance.update, maintenance.delete |
| Incidents | incident.viewAny, incident.view, incident.create, incident.update, incident.delete |
| Nettoyages | cleaning.viewAny, cleaning.view, cleaning.create, cleaning.update, cleaning.delete |
| Pièces | item.viewAny, item.view, item.create, item.update, item.delete, item.generateQrCode, item.scanQrCode |
| Mouvements | item-movement.viewAny, item-movement.view, item-movement.create, item-movement.update, item-movement.delete |
| Entreprises | company.viewAny, company.view, company.create, company.update, company.delete |
| Utilisateurs | user.viewAny, user.view, user.create, user.update, user.delete, user.restore, user.assignDirectPermission, user.assignSite |
| Rôles | role.viewAny, role.view, role.create, role.update, role.delete |
| Permissions | permission.viewAny, permission.view, permission.create, permission.update, permission.delete |
| Paramètres | setting.viewAny, setting.view, setting.update, |
Chaîne de Middleware
Section intitulée « Chaîne de Middleware »Le middleware de permissions s’exécute après la définition du contexte du site :
SetCurrentSite → SetCurrentPermissionsAndRoles → Controller- SetCurrentSite - Lit
user.current_site_id, met en cacheis_on_headquarters - SetCurrentPermissionsAndRoles - Appelle
setPermissionsTeamId(siteId), rafraîchit les relations en cache
Ressources HQ-only
Section intitulée « Ressources HQ-only »Certaines ressources (Companies) ne sont accessibles que depuis le siège :
public function before(User $user, string $ability): ?bool{ if (! isOnHeadquarters()) { return false; // Bloque l'accès depuis les sites réguliers } return null; // Continue vers la vérification spécifique}