Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Exemple 4 : Contrôle d'accès multi-locataires avec RBAC et ABAC
Pour améliorer l'exemple RBAC présenté dans la section précédente, vous pouvez ajouter des attributs aux utilisateurs afin de créer une approche hybride RBAC-ABAC pour le contrôle d'accès multi-locataires. Cet exemple inclut les mêmes rôles que dans l'exemple précédent, mais ajoute l'attribut user account_lockout_flag
et le paramètre de contexteuses_mfa
. L'exemple adopte également une approche différente pour mettre en œuvre le contrôle d'accès multi-locataires en utilisant à la fois le RBAC et l'ABAC, et utilise un magasin de politiques partagé au lieu d'un magasin de politiques différent pour chaque locataire.

Cet exemple représente une solution SaaS multi-locataires dans laquelle vous devez fournir des décisions d'autorisation pour le locataire A et le locataire B, comme dans l'exemple précédent.
Pour implémenter la fonctionnalité de verrouillage utilisateur, l'exemple ajoute l'attribut account_lockout_flag
au principal de l'User
entité dans la demande d'autorisation. Ce drapeau verrouille l'accès des utilisateurs au système et DENY
octroie tous les privilèges à l'utilisateur bloqué. L'account_lockout_flag
attribut est associé à l'User
entité et est actif User
jusqu'à ce que le drapeau soit activement révoqué au cours de plusieurs sessions. L'exemple utilise la when
condition pour évalueraccount_lockout_flag
.
L'exemple ajoute également des détails sur la demande et la session. Les informations contextuelles indiquent que la session a été authentifiée à l'aide de l'authentification multifactorielle. Pour implémenter cette validation, l'exemple utilise la when
condition pour évaluer l'uses_mfa
indicateur dans le cadre du champ de contexte. Pour plus d'informations sur les meilleures pratiques en matière d'ajout de contexte, consultez la documentation de Cedar
permit ( principal in MultitenantApp::Role::"allAccessRole", action in [ MultitenantApp::Action::"viewData", MultitenantApp::Action::"updateData" ], resource ) when { principal.account_lockout_flag == false && context.uses_mfa == true && resource in principal.Tenant };
Cette politique empêche l'accès aux ressources à moins que celles-ci ne soient dans le même groupe que l'Tenant
attribut du principal demandeur. Cette approche visant à maintenir l'isolement des locataires est appelée approche One Shared Multi-Tenant Policy Store. Pour plus d'informations sur les considérations relatives à la conception des autorisations vérifiées pour les applications SaaS multi-locataires, consultez la section Considérations relatives à la conception multi-locataires des autorisations vérifiées.
La politique garantit également que le directeur est membre de allAccessRole
et limite les actions à viewData
etupdateData
. En outre, cette politique vérifie que account_lockout_flag
c'est le cas false
et que la valeur de contexte de est uses_mfa
évaluée à. true
De même, la politique suivante garantit que le principal et la ressource sont associés au même locataire, ce qui empêche l'accès entre locataires. Cette politique garantit également que le directeur est membre viewDataRole
et limite les actions àviewData
. En outre, il vérifie que la valeur de contexte account_lockout_flag
est false
et que la valeur de contexte de est uses_mfa
évaluée à. true
permit ( principal in MultitenantApp::Role::"viewDataRole", action == MultitenantApp::Action::"viewData", resource ) when { principal.account_lockout_flag == false && context.uses_mfa == true && resource in principal.Tenant };
La troisième politique est similaire à la précédente. La politique exige que la ressource soit membre du groupe correspondant à l'entité représentée parprincipal.Tenant
. Cela garantit que le principal et la ressource sont associés au locataire B, ce qui empêche l'accès entre locataires. Cette politique garantit que le directeur est membre updateDataRole
et limite les actions àupdateData
. En outre, cette politique vérifie que la valeur de contexte account_lockout_flag
est false
et que la valeur de contexte de est uses_mfa
évaluée à. true
permit ( principal in MultitenantApp::Role::"updateDataRole", action == MultitenantApp::Action::"updateData", resource ) when { principal.account_lockout_flag == false && context.uses_mfa == true && resource in principal.Tenant };
La demande d'autorisation suivante est évaluée selon les trois politiques décrites plus haut dans cette section. Dans cette demande d'autorisation, le principal de type User
et avec une valeur de Alice
fait une updateData
demande avec le rôleallAccessRole
. Alice
possède l'attribut Tenant
dont la valeur estTenant::"TenantA"
. L'action Alice
que vous essayez d'exécuter est updateData,
et la ressource à laquelle elle sera appliquée est SampleData
du typeData
. SampleData
a TenantA
comme entité mère.
Selon la première politique du magasin de <DATAMICROSERVICE_POLICYSTOREID>
politiques, Alice
vous pouvez effectuer l'updateData
action sur la ressource, en supposant que les conditions de la when
clause de la politique sont remplies. La première condition exige que l'principal.Tenant
attribut soit évalué àTenantA
. La deuxième condition exige que l'attribut account_lockout_flag
du principal soitfalse
. La dernière condition exige que le contexte uses_mfa
soittrue
. Les trois conditions étant remplies, la demande renvoie une ALLOW
décision.
{ "policyStoreId": "DATAMICROSERVICE_POLICYSTORE", "principal": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "action": { "actionType": "MultitenantApp::Action", "actionId": "updateData" }, "resource": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "context": { "contextMap": { "uses_mfa": { "boolean": true } } }, "entities": { "entityList": [ { "identifier": { "entityType": "MultitenantApp::User", "entityId": "Alice" }, "attributes": { { "account_lockout_flag": { "boolean": false }, "Tenant": { "entityIdentifier": { "entityType":"MultitenantApp::Tenant", "entityId":"TenantA" } } } }, "parents": [ { "entityType": "MultitenantApp::Role", "entityId": "allAccessRole" } ] }, { "identifier": { "entityType": "MultitenantApp::Data", "entityId": "SampleData" }, "attributes": {}, "parents": [ { "entityType": "MultitenantApp::Tenant", "entityId": "TenantA" } ] } ] } }