Products Manager APP

API Reference

Permissions & RBAC

L'API Products Manager utilise un systeme RBAC (Role-Based Access Control) pour gerer les autorisations de maniere granulaire et securisee.


Vue d'Ensemble

Le systeme de permissions offre :

  • Controle d'acces base sur les roles (RBAC)
  • Permissions granulaires par ressource et action
  • Support des permissions personnalisees par utilisateur
  • Priorite : Superuser > Permissions JSON > Role

Hierarchie des Roles

Products Manager definit 4 roles avec des niveaux de privileges croissants :

RoleDescriptionNiveau d'Acces
GUESTVisiteurAucun acces par defaut
USERUtilisateur standardLecture + imports basiques
MANAGERGestionnaireLecture/ecriture sans suppression ni admin
ADMINAdministrateurToutes les permissions

Les Superusers ont automatiquement acces a toutes les permissions, independamment de leur role ou des permissions JSON configurees.


Format des Permissions

Les permissions suivent le format action:resource :

read:products      # Lecture des produits
write:suppliers    # Creation/modification des fournisseurs
delete:imports     # Suppression des imports
manage:cache       # Gestion complete du cache

Actions Disponibles

ActionDescription
readConsulter les donnees
writeCreer ou modifier
deleteSupprimer definitivement
startDemarrer un processus
cancelAnnuler un processus en cours
manageGestion complete (configurations, planifications)
uploadTelecharger des fichiers
executeExecuter une action
adminActions administratives

Permissions par Ressource

Products (Produits)

PermissionDescriptionADMINMANAGERUSERGUEST
read:productsConsulter les produitsXXX-
write:productsCreer/modifier les produitsXX--
delete:productsSupprimer les produitsX---

Suppliers (Fournisseurs)

PermissionDescriptionADMINMANAGERUSERGUEST
read:suppliersConsulter les fournisseursXXX-
write:suppliersCreer/modifier les fournisseursXX--
delete:suppliersSupprimer les fournisseursX---

Imports

PermissionDescriptionADMINMANAGERUSERGUEST
read:importsConsulter les importsXXX-
write:importsCreer des importsXXX-
delete:importsSupprimer les importsX---
start:importsDemarrer un importXX--
cancel:importsAnnuler un import en coursXX--
manage:importsGerer configs et planificationsXX--

Exports

PermissionDescriptionADMINMANAGERUSERGUEST
read:exportsConsulter les exportsXX--
write:exportsCreer des exportsXX--
manage:exportsGerer plateformes et configsXX--

Analytics

PermissionDescriptionADMINMANAGERUSERGUEST
read:analyticsConsulter les analyticsXXX-

Media (Images)

PermissionDescriptionADMINMANAGERUSERGUEST
read:mediaConsulter les mediasXXX-
write:mediaAjouter des mediasXX--
delete:mediaSupprimer les mediasX---

Cache

PermissionDescriptionADMINMANAGERUSERGUEST
read:cacheConsulter le cacheXXX-
write:cacheModifier le cacheXX--
manage:cacheGestion complete du cacheX---

Code2ASIN

PermissionDescriptionADMINMANAGERUSERGUEST
read:code2asinConsulter les jobs Code2ASINXXX-
write:code2asinCreer des jobs Code2ASINXXX-
delete:code2asinSupprimer les jobs Code2ASINX---

Templates (Mapping Templates)

PermissionDescriptionADMINMANAGERUSERGUEST
read:templatesConsulter les templatesXXX-
write:templatesCreer/modifier les templatesXX--
delete:templatesSupprimer les templatesX---

System & Monitoring

PermissionDescriptionADMINMANAGERUSERGUEST
read:systemConsulter infos systemeX---
read:monitoringConsulter metriques systemeXXX-

Files

PermissionDescriptionADMINMANAGERUSERGUEST
read:filesConsulter les fichiersXX--
write:filesCreer des fichiersXX--
upload:filesTelecharger des fichiersXXX-

Prices (Prix)

PermissionDescriptionADMINMANAGERUSERGUEST
read:pricesConsulter les prixXXX-
write:pricesModifier les prixXX--
delete:pricesSupprimer les prixX---

Environmental Data

PermissionDescriptionADMINMANAGERUSERGUEST
read:environmental_dataConsulter donnees environnementalesXXX-
write:environmental_dataModifier donnees environnementalesXX--

AI Metadata

PermissionDescriptionADMINMANAGERUSERGUEST
read:ai_metadataConsulter metadonnees IAXXX-
write:ai_metadataModifier metadonnees IAXX--

Workflows

PermissionDescriptionADMINMANAGERUSERGUEST
read:workflowsConsulter les workflowsXXX-
write:workflowsCreer/modifier les workflowsXX--
execute:workflowsExecuter les workflowsXX--
delete:workflowsSupprimer les workflowsX---

Tags

PermissionDescriptionADMINMANAGERUSERGUEST
read:tagsConsulter les tagsXXX-
write:tagsCreer/modifier les tagsXX--
delete:tagsSupprimer les tagsX---

Integrations

PermissionDescriptionADMINMANAGERUSERGUEST
read:integrationsConsulter statut integrationsXXX-
manage:integrationsGerer les integrationsX---

Enrichment

PermissionDescriptionADMINMANAGERUSERGUEST
read:enrichmentConsulter statut enrichissementXXX-
manage:enrichmentGerer l'enrichissementXX--

Reports

PermissionDescriptionADMINMANAGERUSERGUEST
read:reportsConsulter les rapportsXXX-
manage:reportsGerer les rapportsXX--

Administration

PermissionDescriptionADMINMANAGERUSERGUEST
admin:accessAcces panneau adminX---
admin:usersGerer les utilisateursX---
admin:user_createCreer des utilisateursX---
admin:user_updateModifier des utilisateursX---
admin:user_deleteSupprimer des utilisateursX---
admin:role_assignAssigner des rolesX---
admin:permission_assignAssigner des permissionsX---
admin:settingsGerer les parametresX---
admin:amazon_api_globalGerer config Amazon API globaleX---

Utilisation des Decorateurs de Permission

require_permission

Exige une permission specifique pour acceder a un endpoint :

from core.permissions import Permission, require_permission

@router.get("/products")
async def list_products(
    current_user: User = Depends(require_permission(Permission.READ_PRODUCTS))
):
    # L'utilisateur a la permission read:products
    return await get_products()

require_any_permission

Exige au moins une des permissions specifiees :

from core.permissions import Permission, require_any_permission

@router.get("/dashboard")
async def get_dashboard(
    current_user: User = Depends(
        require_any_permission(Permission.READ_PRODUCTS, Permission.READ_ANALYTICS)
    )
):
    # L'utilisateur a au moins une des deux permissions
    return await get_dashboard_data()

require_all_permissions

Exige toutes les permissions specifiees :

from core.permissions import Permission, require_all_permissions

@router.delete("/critical-operation")
async def critical_operation(
    current_user: User = Depends(
        require_all_permissions(Permission.DELETE_PRODUCTS, Permission.ADMIN_ACCESS)
    )
):
    # L'utilisateur a les DEUX permissions requises
    return await perform_critical_operation()

require_role

Exige un role specifique :

from core.permissions import Role, require_role

@router.get("/admin/settings")
async def admin_settings(
    current_user: User = Depends(require_role(Role.ADMIN))
):
    # Seuls les ADMIN peuvent acceder
    return await get_settings()

Gestion des Erreurs 403

Quand un utilisateur n'a pas les permissions requises, l'API retourne une erreur 403 Forbidden :

Reponse d'Erreur

{
  "detail": "Insufficient permissions. Required: read:products"
}

Erreur pour Permissions Multiples

{
  "detail": "Insufficient permissions. Required one of: read:products, read:analytics"
}
{
  "detail": "Insufficient permissions. Required all of: delete:products, admin:access"
}

Erreur de Role

{
  "detail": "Insufficient role. Required: admin, you have: user"
}

Permissions Personnalisees (JSON)

Les utilisateurs peuvent avoir des permissions granulaires stockees dans un champ JSON, qui prennent priorite sur les permissions basees sur le role :

{
  "read:products": true,
  "write:suppliers": true,
  "delete:products": false,
  "manage:imports": true
}

Si des permissions JSON sont definies pour un utilisateur, elles remplacent completement les permissions du role. Assurez-vous de configurer toutes les permissions necessaires.


Priorite de Resolution

L'ordre de priorite pour determiner les permissions d'un utilisateur :

  1. Superuser : A toutes les permissions (bypass complet)
  2. Permissions JSON : Si definies, utilisees exclusivement
  3. Role : Fallback vers les permissions du role assigne
def get_user_permissions(user: User) -> list[Permission]:
    # 1. Superuser = toutes les permissions
    if user.is_superuser:
        return list(Permission)

    # 2. Permissions JSON si definies
    if user.permissions:
        return parse_json_permissions(user.permissions)

    # 3. Permissions basees sur le role
    return ROLE_PERMISSIONS.get(user.role, [])

Bonnes Pratiques

  1. Principe du moindre privilege : Attribuez uniquement les permissions necessaires
  2. Utilisez les roles : Preferez les roles aux permissions individuelles pour la maintenabilite
  3. Auditez regulierement : Verifiez periodiquement les permissions des utilisateurs
  4. Superusers limites : Restreignez le nombre de superusers au strict minimum

Ressources Associees