Que sont les permissions au niveau de la classe (CLP) ?

Mis à jour : septembre 2026

Une permission au niveau de la classe est une règle du schéma qui contrôle quels utilisateurs ou rôles peuvent exécuter chaque opération sur cette classe. C’est la porte la plus extérieure de la sécurité de la couche de données : avant tout contrôle ligne par ligne, la classe elle-même décide si cet appelant a le droit d’interroger, de créer, de modifier ou de supprimer ici — une règle, toute la table, vérifiée en premier.

Points clés

QuestionRéponse
Ce que c’estDes règles d’accès par opération sur la classe (table) elle-même
vs. ACLLa CLP garde la classe ; les ACL gardent chaque ligne — une requête doit franchir les deux
Les opérationsFind, get, count, create, update, delete, add field — chacune réglée séparément
Les réglages par défaut essentielsExiger l’authentification, verrouiller add field, ne jamais livrer la master key
Le cousin SQLGRANT/REVOKE sur les tables et les schémas — même idée, autre syntaxe

La porte de la classe, déclarée puis ressentie

Une CLP est de la configuration de schéma — ici sous la forme du payload REST qui verrouille une classe Config en lecture publique, écriture réservée au serveur :

PUT /schemas/Config
{
  "classLevelPermissions": {
    "find":   { "*": true },              // tout le monde peut interroger
    "get":    { "*": true },
    "create": {},                         // personne côté client
    "update": { "role:admin": true },     // admins uniquement
    "delete": {},
    "addField": {}                        // schéma figé
  }
}

Ce que vivent les clients, c’est la porte qui fait son travail — les lectures passent, les écritures meurent à la frontière de la classe avant que la moindre donnée ne soit touchée :

// JavaScript / Node.js — Back4app JS SDK
// The class gate in action: Config is read-only for clients (CLP),
// so reads succeed and writes never reach the data
const config = await new Parse.Query('Config').first(); // ✓ public read

const c = new Parse.Object('Config');
c.set('flag', true);
try {
  await c.save(); // ✗ CLP blocks client writes to this class entirely
} catch (e) {
  console.log(e.code); // 119: operation forbidden by class-level permissions
}

Comment les permissions au niveau de la classe et les ACL fonctionnent ensemble

Comment les permissions au niveau de la classe et les ACL se combinentChaque requête franchit d'abord la porte des permissions au niveau de la classe pour son opération ; l'ACL par objet n'est consultée que si la classe l'autorise, et chacune des deux portes peut refuser la requête.

non

oui

non

oui

Requête :
modifier l'objet X de la classe C

Porte de la classe (CLP) :
cet appelant peut-il
modifier la classe C ?

Refusé — 119

Porte de l'objet (ACL) :
cet appelant peut-il
écrire l'objet X ?

Refusé — objet masqué

Autorisé

Chaque requête franchit d'abord la porte des permissions au niveau de la classe pour son opération ; l'ACL par objet n'est consultée que si la classe l'autorise, et chacune des deux portes peut refuser la requête.

L’échelle de granularité : CLP vs. ACL vs. pointer permissions vs. champs protégés

MécanismePortéeDéclaré oùVérifiéRôle typique
Permission au niveau de la classeToute la classe, par opérationSchémaEn premier”Les clients n’écrivent jamais dans Config
Pointer permissionPar objet, via une règle de schémaSchéma (indexée sur un champ)En second”Seul l’owner touche ses lignes”
ACLPar objetSur chaque ligne, sous forme de donnéeEn second”Cette note : son auteur uniquement”
Champs protégésPar colonneSchémaÀ la lecture”Masquer email aux autres utilisateurs”

L’idiome de conception qui en découle : les grandes lignes dans le schéma, le grain fin dans les lignes. Les classes dont la règle d’accès est uniforme (configuration, catalogues, logs) n’ont besoin que de la porte de la classe ; les classes contenant des données par utilisateur y ajoutent des ACL ou des pointer permissions en dessous.

La même porte dans d’autres moteurs

-- PostgreSQL : les privilèges de table sont des CLP sous un autre nom
GRANT SELECT ON films TO PUBLIC;
GRANT INSERT, UPDATE ON films TO role_editor;
REVOKE ALL ON launch_codes FROM PUBLIC;

Les bases documentaires le reproduisent avec des rôles limités à des actions au niveau de la collection — un rôle doté de find et insert sur une seule collection. Le concept est universel ; ce qui change, c’est l’ergonomie : les GRANT SQL et les documents de rôles s’administrent dans le code, tandis que les plateformes BaaS exposent la même matrice sous forme de cases à cocher dans le dashboard.

Réglages recommandés par type de contenu

Type de contenuFind/GetCreateUpdate/DeleteAdd field
Contenu public (catalogue, publications)PublicRôles/serveurRôles/serveurDésactivé
Données appartenant à l’utilisateur (notes, commandes)Authentifié + ACLAuthentifiéLimité par ACLDésactivé
Configuration et flagsPublic ou authentifiéPersonne (serveur uniquement)Rôle adminDésactivé
Logs et analytiquePersonne (serveur uniquement)Authentifié (écriture seule)PersonneDésactivé
Données réservées aux adminsRôle adminRôle adminRôle adminDésactivé

Ce tableau est la checklist dont la plupart des lancements ont réellement besoin — remarquez la constante dans la dernière colonne, et sa règle sœur : la création de classes côté client désactivée en production, pour que le schéma ne change que volontairement.

Cas d’usage courants

  • Figer les schémas de production. Add field désactivé partout ; les classes cessent d’apparaître et de muter au gré du trafic client.
  • Données de référence en lecture seule. Catalogues et paramètres lisibles publiquement, modifiables uniquement par le code serveur — le modèle Config ci-dessus.
  • Boîtes de dépôt en écriture seule. Des classes de feedback et de télémétrie dans lesquelles les clients peuvent créer mais jamais lire — la porte inverse que le code de la couche applicative oublie souvent.
  • Surfaces d’administration par rôle. Update et delete réservés à un rôle admin, pendant que l’application lit librement.
  • Défense contre le dump classique. Le tristement célèbre one-liner — un curl muni d’un app ID qui interroge une classe User ouverte — meurt à la porte find dès que la classe exige l’authentification.

La porte de la classe ou le code serveur ? Matrice de décision

Appliquez avec les CLP (+ ACL) quand…Passez par le code serveur quand…
La règle est “qui peut faire quoi, où”La règle exige de la logique métier (“seulement avant l’expédition de la commande”)
Elle est uniforme par classe ou par propriétaireElle s’étend sur plusieurs objets ou classes
Vous voulez qu’elle s’applique sur tous les chemins, y compris les nouveaux clientsVous voulez un point de passage unique et audité pour un workflow sensible
Le déclaratif l’emporte sur l’impératif pour la revueValidation, enrichissement ou effets de bord doivent suivre
La case à cocher du dashboard est toute la spécificationLa spécification est un paragraphe de conditions

Les deux se composent : le modèle durci pour les classes vraiment sensibles verrouille entièrement les CLP et expose des fonctions côté serveur comme seule porte d’entrée — la porte de la classe garantit que personne ne contourne le point de passage.

Limites et trade-offs

  • La granularité de classe est grossière par définition. Tout ce qui est par ligne revient aux ACL et aux pointer permissions ; tout ce qui est conditionnel relève de la validation côté serveur — les CLP filtrent, elles ne raisonnent pas.
  • Les réglages par défaut sont permissifs pour le développement. Les nouvelles classes naissent ouvertes pour que les prototypes avancent vite ; la passe d’avant lancement qui applique le tableau ci-dessus est une discipline, pas un automatisme.
  • La master key ignore tout. Chaque porte de cet article tombe partout où cette clé circule — c’est pourquoi elle reste exclusivement côté serveur, utilisée opération par opération, jamais livrée.
  • La surface d’application doit être complète. Les abonnements temps réel et les endpoints spéciaux ont connu par le passé des trous d’application — maintenez la plateforme à jour et testez les portes depuis un vrai client, pas seulement depuis le dashboard.
  • Les cases à cocher méritent aussi une revue. La sécurité déclarative n’est une sécurité auditable que si quelqu’un l’audite — la matrice de réglages a sa place dans votre checklist de lancement, pas dans la mémoire collective.

Les CLP sur Back4app

Back4app est une plateforme open-source de Backend as a Service (BaaS) qui combine une base de données gérée, des API REST et GraphQL générées automatiquement, l’authentification, le stockage de fichiers et des fonctions serverless avec Cloud Code. Les permissions au niveau de la classe y sont la surface de sécurité du schéma rendue visuelle : chaque classe du dashboard porte la matrice des opérations sous forme de cases à cocher — public, authentification requise, par rôle — ainsi que les pointer permissions et les champs protégés, appliqués côté serveur à chaque requête, aussi bien via les SDK que via REST et GraphQL. En dessous se trouvent les ACL par objet ; au-dessus, les triggers Cloud Code pour les règles qui demandent de la logique. Les recommandations de sécurité détaillent toute la passe d’avant lancement — la matrice de réglages de cet article, appliquée clic par clic.

Questions fréquentes

Que sont les permissions au niveau de la classe ?

Des règles attachées au schéma d'une classe (table/collection) qui contrôlent quels utilisateurs ou rôles peuvent effectuer chaque opération — find, get, count, create, update, delete, add field — sur n'importe quel objet de cette classe. C'est la porte d'accès la plus grossière et la première vérifiée : si la règle de classe refuse une opération, aucune permission par objet n'est jamais consultée.

Quelle est la différence entre les CLP et les ACL ?

La portée et l'ordre. Une CLP répond à "qui peut toucher cette classe, tout court" — une règle pour toute la table. Une ACL répond à "qui peut toucher cette ligne précise" — une donnée portée par chaque objet. Une requête doit franchir les deux portes : d'abord celle de la classe, puis celle de l'objet, et chacune peut refuser. Les grandes lignes au niveau de la classe, le grain fin au niveau de l'objet.

Qu'est-ce que requiresAuthentication ?

Le réglage intermédiaire entre public et rôles énumérés : il réserve une opération à tout utilisateur connecté disposant d'une session valide, sans nommer d'utilisateurs ni de rôles précis. C'est le bon défaut pour la plupart des données applicatives — les requêtes anonymes sont rejetées, tandis que chaque utilisateur authentifié franchit la porte de la classe et passe aux contrôles d'ACL par objet.

Que sont les pointer permissions ?

Des règles au niveau de la classe indexées sur un champ Pointer vers un utilisateur de l'objet — par exemple "seul l'utilisateur du champ owner peut lire ou écrire". Elles agissent comme une ACL virtuelle : l'application est par objet, mais la règle est déclarée une seule fois dans le schéma au lieu d'être stockée sur chaque ligne. Elles se combinent avec les vraies ACL ; les deux doivent autoriser l'action.

Que sont les champs protégés (protected fields) ?

Des règles au niveau du champ, superposées à la porte de la classe : certaines colonnes — une adresse e-mail, un score interne — sont masquées pour certains demandeurs tandis que le reste de l'objet reste lisible. Elles transforment l'échelle des permissions en trois barreaux sur un même schéma : opérations sur toute la classe, accès par objet et visibilité par champ.

Quel est l'équivalent SQL des permissions au niveau de la classe ?

Les privilèges de table et de schéma : GRANT SELECT, INSERT, UPDATE, DELETE ON une table à un rôle, REVOKE pour les retirer, plus les droits USAGE et CREATE au niveau du schéma. Le concept se transpose un pour un — un GRANT au niveau de la table est une permission au niveau de la classe avec une autre syntaxe — et les bases documentaires le reproduisent avec des rôles limités à des actions au niveau de la collection.

Les clients doivent-ils pouvoir ajouter des champs ou créer des classes en production ?

Non — c'est l'étape de durcissement qui fait consensus. La flexibilité du schéma est un confort de développement ; en production, désactivez la permission add field sur chaque classe et coupez entièrement la création de classes côté client, ce qui fige le schéma face aux clients. Les changements de schéma passent alors par le dashboard ou par le code serveur, là où ils ont leur place.

Les permissions au niveau de la classe suffisent-elles à sécuriser une application ?

Elles sont la première couche, pas toute la défense. Le stack standard : les CLP filtrent les opérations par classe, les ACL ou les pointer permissions délimitent les lignes, les champs protégés masquent les colonnes sensibles et les triggers côté serveur valident les écritures. Et une règle au-dessus de toutes : la master key — qui contourne toutes les portes — n'est jamais livrée dans le code client.

Termes associés

À comparer avec

Lectures recommandées

Prêt à construire votre backend ?

Lancez votre projet sur Back4app en quelques minutes — base de données, authentification, API et Cloud Code inclus. Sans carte bancaire.

Écrit et révisé par Back4app Engineering, Back4app Engineering · Publié le 2026-09-11