Fonctionnement des droits et permissions¶
Utilisateur connecté et Principals¶
Lorsqu’un utilisateur est connecté, on détermine ses principals.
[
'system.Everyone',
'system.Authenticated',
'prenom.nom@example.com',
'user:1035',
'login:269',
'group:trainer',
'access_right:es_trainer',
'group:accounting',
'access_right:global_config_accounting',
'access_right:global_config_sale',
'access_right:global_config_supply',
'access_right:global_accountant',
'access_right:global_validate_invoice',
'access_right:global_validate_cancelinvoice',
'access_right:global_validate_estimation',
'access_right:global_validate_supplier_order',
'access_right:global_validate_supplier_invoice',
'access_right:global_validate_expensesheet',
'access_right:global_record_payment_invoice',
'access_right:global_record_payment_supplier_invoice',
'access_right:global_record_payment_expensesheet',
'access_right:global_company_supervisor',
'access_right:global_supervisor_salary',
'access_right:global_userdata_restricted',
'company:181527',
'company:181750'
]
Context et traversal¶
En parallèle de la construction des principals d’un utlisateur, l’application détermine un contexte pour la requête courante. Celui-ci est:
un modèle
la
caerp.utils.security.acls.RootFactory
L’arbre de traversal est définit dans caerp.utils.security.acls.
Permission¶
Les permissions sont utlisées pour contrôler :
L’accès à une resource (view Pyramid)
Les actions sur des modèles (validation d’une facture par exemple)
Les permissions sont vérifiées à l’aide de la méthode has_permission de l’objet request
# Check la permission context.add_file sur le contexte courant
request.has_permission(PERMISSIONS["context.add_file"])
# Check la permission context.add_file sur un objet particulier (autre que le contexte)
request.has_permission(PERMISSIONS["context.add_file"], mon_instance_de_modele_sqlalchemy)
Au sein des templates, à l’aide d’un utilitaire api.has_permission
# Check la permission context.add_file sur le contexte courant
api.has_permission("context.add_file")
# Check la permission context.add_file sur un objet particulier (autre que le contexte)
api.has_permission("context.add_file", mon_instance_de_modele_sqlalchemy)
L’ensemble des permissions sont définies dans caerp.consts.permissions
Sous le capot, Pyramid teste la permission via la caerp.utils.security.policy.SessionSecurityPolicy
SessionSecurityPolicy¶
La caerp.utils.security.policy.SessionSecurityPolicy traite les différentes permissions
en fonction de leur préfixe :
“global.” : pour des permissions globales
“company:” : pour des permissions spécifiques à une enseigne
Pour les autres elle délègue le traitement au système d’ACL de pyramid.
Permissions globales¶
Les permissions globales d’un utilisateur sont déterminées via le chemin suivant :
caerp.models.user.login.Login
caerp.models.user.group.Group
caerp.models.user.access_right.AccessRight
caerp.consts.access_rights
Permissions au niveau de l’enseigne¶
Les permissions au niveau de l’enseigne sont déterminées en fonction du context passé à has_permission:
On récupère l’enseigne associée au contexte
On calcule les acl sur l’enseigne
Les ACL de l’enseigne sont comparées aux principals de l’utilisateur courant
Permissions au niveau d’un modèle¶
Les permissions au niveau des modèles sont déterminées en fonction du context passé à has_permission:
On calcule les acl sur l’instance de modèle
Les ACL sur l’instance de modèle sont comparées aux principals de l’utilisateur courant
Modèles et bout de code concernés¶
caerp.models.user.access_right.AccessRight
caerp.models.user.group.Group
caerp.models.user.user.User
caerp.models.user.login.Login
caerp.utils.security.policy.SessionSecurityPolicy
caerp.utils.security.identity.get_identity()
caerp.services.company.find_company_id_from_model()
caerp.consts.permissions
caerp.consts.access_rights