Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Ejemplo 4: Control de acceso multiusuario con RBAC y ABAC
Para mejorar el ejemplo del RBAC de la sección anterior, puede añadir atributos a los usuarios para crear un enfoque híbrido RBAC-ABAC para el control de acceso de varios usuarios. Este ejemplo incluye las mismas funciones del ejemplo anterior, pero añade el atributo de usuario y el parámetro de contexto. account_lockout_flag
uses_mfa
El ejemplo también adopta un enfoque diferente para implementar el control de acceso multiusuario mediante RBAC y ABAC, y usa un almacén de políticas compartido en lugar de un almacén de políticas diferente para cada inquilino.

Este ejemplo representa una solución SaaS multiusuario en la que debe proporcionar decisiones de autorización para el arrendatario A y el arrendatario B, de forma similar al ejemplo anterior.
Para implementar la función de bloqueo de usuarios, el ejemplo agrega el atributo account_lockout_flag
a la User
entidad principal en la solicitud de autorización. Este indicador bloquea el acceso del usuario al sistema y DENY
otorga todos los privilegios al usuario bloqueado. El account_lockout_flag
atributo está asociado a la User
entidad y estará en vigor User
hasta que la marca se revoque activamente en varias sesiones. En el ejemplo se usa la when
condición para evaluaraccount_lockout_flag
.
El ejemplo también agrega detalles sobre la solicitud y la sesión. La información de contexto especifica que la sesión se ha autenticado mediante la autenticación multifactorial. Para implementar esta validación, el ejemplo usa la when
condición para evaluar el uses_mfa
indicador como parte del campo de contexto. Para obtener más información sobre las prácticas recomendadas para añadir contexto, consulte la documentación 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 };
Esta política impide el acceso a los recursos a menos que el recurso esté en el mismo grupo que el Tenant
atributo del principal solicitante. Este enfoque para mantener el aislamiento de los inquilinos se denomina enfoque de un almacén de políticas compartido para varios inquilinos. Para obtener más información sobre las consideraciones de diseño de permisos verificados para aplicaciones SaaS de varios inquilinos, consulte la sección Consideraciones de diseño de permisos verificados para múltiples inquilinos.
La política también garantiza que el director sea miembro de allAccessRole
y restringe las acciones a y. viewData
updateData
Además, esta política verifica que así account_lockout_flag
sea false
y que el valor de contexto para la uses_mfa
evaluación sea igual a. true
Del mismo modo, la siguiente política garantiza que tanto el principal como el recurso estén asociados al mismo inquilino, lo que impide el acceso entre inquilinos. Esta política también garantiza que el director sea miembro viewDataRole
y restringe las acciones a. viewData
Además, verifica que el account_lockout_flag
es false
y que el valor de contexto para el que se uses_mfa
evalúa. 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 tercera política es similar a la anterior. La política exige que el recurso sea miembro del grupo que corresponda a la entidad por la que está representadoprincipal.Tenant
. Esto garantiza que tanto el principal como el recurso estén asociados al inquilino B, lo que impide el acceso entre inquilinos. Esta política garantiza que el director sea miembro updateDataRole
y restringe las acciones a. updateData
Además, esta política verifica que account_lockout_flag
es false
y que el valor de contexto se uses_mfa
evalúa como tal. 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 siguiente solicitud de autorización se evalúa mediante las tres políticas descritas anteriormente en esta sección. En esta solicitud de autorización, el principal del tipo User
y con un valor de Alice
realiza una updateData
solicitud con el rolallAccessRole
. Alice
tiene el atributo Tenant
cuyo valor esTenant::"TenantA"
. La acción que Alice
se intenta realizar es de ese tipo updateData,
y el recurso al que se aplicará es SampleData
de ese tipoData
. SampleData
tiene TenantA
como entidad principal.
Según la primera política del almacén de <DATAMICROSERVICE_POLICYSTOREID>
políticas, Alice
puede realizar la updateData
acción en el recurso, suponiendo que se cumplan las condiciones de la when
cláusula de la política. La primera condición requiere que el principal.Tenant
atributo se evalúeTenantA
. La segunda condición requiere que el atributo del principal account_lockout_flag
seafalse
. La condición final requiere que el contexto uses_mfa
seatrue
. Como se cumplen las tres condiciones, la solicitud devuelve una ALLOW
decisión.
{ "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" } ] } ] } }