Skip to content

Rôles & Permissions

XetaSuite utilise Spatie Laravel-Permission avec le mode teams activé pour gérer les permissions par site.

User ─┬─ Site 1 ─── Role: Admin ─── Permissions: [company.*, user.*, ...]
├─ Site 2 ─── Role: Manager ─── Permissions: [material.*, zone.*, ...]
└─ Site 3 ─── Role: User ─── Permissions: [material.view, zone.view]
'teams' => true,
'team_foreign_key' => 'site_id',
// ⚠️ TOUJOURS définir le contexte du site AVANT l'assignation
setPermissionsTeamId($site->id);
// Assigner le rôle
$user->assignRole('manager');
// Le rôle est enregistré avec site_id dans la table pivot
class CompanyPolicy
{
public function view(User $user, Company $company): bool
{
// Vérifie la permission pour le site actuel
return $user->can('company.view');
}
}
public function index(Request $request)
{
// Via Gate
$this->authorize('viewAny', Company::class);
// Ou directement
if ($request->user()->can('company.viewAny')) {
// ...
}
}
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 />}
{resource}.{action}
ActionDescription
viewAnyVoir la liste
viewVoir un élément
createCréer
updateModifier
deleteSupprimer
ModulePermissions
Sitessite.viewAny, site.view, site.create, site.update, site.delete
Zoneszone.viewAny, zone.view, zone.create, zone.update, zone.delete
Matérielsmaterial.viewAny, material.view, material.create, material.update, material.delete, material.generateQrCode, material.scanQrCode
Maintenancesmaintenance.viewAny, maintenance.view, maintenance.create, maintenance.update, maintenance.delete
Incidentsincident.viewAny, incident.view, incident.create, incident.update, incident.delete
Nettoyagescleaning.viewAny, cleaning.view, cleaning.create, cleaning.update, cleaning.delete
Piècesitem.viewAny, item.view, item.create, item.update, item.delete, item.generateQrCode, item.scanQrCode
Mouvementsitem-movement.viewAny, item-movement.view, item-movement.create, item-movement.update, item-movement.delete
Entreprisescompany.viewAny, company.view, company.create, company.update, company.delete
Utilisateursuser.viewAny, user.view, user.create, user.update, user.delete, user.restore, user.assignDirectPermission, user.assignSite
Rôlesrole.viewAny, role.view, role.create, role.update, role.delete
Permissionspermission.viewAny, permission.view, permission.create, permission.update, permission.delete
Paramètressetting.viewAny, setting.view, setting.update,

Le middleware de permissions s’exécute après la définition du contexte du site :

SetCurrentSite → SetCurrentPermissionsAndRoles → Controller
  1. SetCurrentSite - Lit user.current_site_id, met en cache is_on_headquarters
  2. SetCurrentPermissionsAndRoles - Appelle setPermissionsTeamId(siteId), rafraîchit les relations en cache

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
}