

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
<a name="avp-mt-abac-rbac-examples"></a>

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. 

![Ejemplo de control de acceso multiusuario con RBAC, ABAC, Amazon Verified Permissions y Cedar](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-4.png)


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 evaluar`account_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](https://docs.cedarpolicy.com/auth/entities-syntax.html).

```
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](avp-design-considerations.md).

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á representado`principal.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 rol`allAccessRole`. `Alice`tiene el atributo `Tenant` cuyo valor es`Tenant::"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 tipo`Data`. `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úe`TenantA`. La segunda condición requiere que el atributo del principal `account_lockout_flag` sea`false`. La condición final requiere que el contexto `uses_mfa` sea`true`. 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"
            }
        ]
      }
    ]
  }
}
```