Profils
Les acteurs, rangés en catégories. Un profil se reconnaît à une condition sur l'identité ; les permissions disent ensuite ce qu'il a le droit de faire.
Users et admins
Une station a deux sortes de personnes, et deux plans d'accès qui ne se mélangent pas :
| users — la room | admins — la console | |
|---|---|---|
| station product | les clients | l'équipe du product builder |
| station process | les employés, membres de l'équipe | l'admin, l'équipe IT |
| font | réserver, approuver, soumettre | configurer, publier, lire le journal, traiter les incidents |
| réglés par | profils et permissions, dans la config | les droits de la console, dans l'organisation |
L'employé est à une station process ce que le client est à une station product ; l'admin IT est ce
qu'est le product builder. Une même personne peut tenir les deux : un employé de l'IT qui soumet la
création d'un compte agit en user de profil it ; quand il modifie la config, en admin.
Les profils et les permissions s'appliquent aux users, et aux agents qui agissent pour eux. Ni aux admins, ni aux automatisations.
Les profils : le « qui », comme les kinds sont le « quoi »
Un kind classe les actions par une condition sur leurs champs, et peut changer leur présentation, leur sélection et leur submit. Un profil classe les users par une condition sur leur identité, et peut changer les mêmes points.
profiles:
anonyme: # le profil par défaut
when: "identity.authenticated == false"
grants: [cuisine.getMenu, cuisine.placeOrder, cuisine.getDeliveryOptions, cuisine.createDelivery]
client:
when: "identity.authenticated and identity.type == 'person'"
grants: [cuisine.getMenu, cuisine.placeOrder, cuisine.getDeliveryOptions, cuisine.createDelivery,
cuisine.listOrders, cuisine.cancelOrder]
agent-entreprise: # pas de cancelOrder : annuler reste un acte humain
when: "identity.type == 'agent' and identity.org != null"
grants: [cuisine.getMenu, cuisine.placeOrder, cuisine.getDeliveryOptions, cuisine.createDelivery]
manager:
when: "'support-manager' in identity.roles"
grants: [paiement.proposeRefund, paiement.createRefund]
Un profil reçoit des opérations avec grants ; une opération qu'aucun profil n'a reçue n'est
appelée pour personne. Voir Permissions.
Une identité peut correspondre à plusieurs profils : tous s'appliquent.
L'identité vient de la porte et de ses fournisseurs : un visiteur anonyme du widget, un client
vérifié par un code ou par le login du tenant, un agent avec sa sous-identité déléguée, un salarié
par l'annuaire de l'organisation. Les champs que lit when sont décrits dans
Identité.
Spécialiser par profil : per_profile
Un profil peut être servi autrement, sur les mêmes points qu'un kind :
skills:
- name: takeDeliveryOption
per_profile:
agent-entreprise: # un agent ne livre qu'à une adresse enregistrée
select: {guards: [{name: adresse-enregistree, require: "$item.fields.address in identity.addresses"}]}
manager:
present: {fields: {margin: {from: margin, type: price}}}
Montrer plus de colonnes à un manager, c'est de l'interface. Cacher un outil à un profil ne
l'interdit pas : ce qui est permis s'écrit en grants et se resserre en permission ou garde. Ce
qu'un profil ne doit pas voir se règle par une permission dans present, que Core applique
avant le modèle (Permissions).