

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Esempio 4: controllo degli accessi multi-tenant con RBAC e ABAC
<a name="avp-mt-abac-rbac-examples"></a>

Per migliorare l'esempio RBAC della sezione precedente, è possibile aggiungere attributi agli utenti per creare un approccio ibrido RBAC-ABAC per il controllo degli accessi multi-tenant. Questo esempio include gli stessi ruoli dell'esempio precedente, ma aggiunge l'attributo user e il parametro context. `account_lockout_flag` `uses_mfa` L'esempio adotta inoltre un approccio diverso all'implementazione del controllo degli accessi multi-tenant utilizzando sia RBAC che ABAC e utilizza un archivio di politiche condiviso anziché un archivio di politiche diverso per ogni tenant. 

![Esempio di controllo degli accessi multi-tenant con RBAC, ABAC, Amazon Verified Permissions e Cedar](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/saas-multitenant-api-access-authorization/images/avp-example-4.png)


Questo esempio rappresenta una soluzione SaaS multi-tenant in cui è necessario fornire decisioni di autorizzazione per il Tenant A e il Tenant B, in modo simile all'esempio precedente.

Per implementare la funzionalità di blocco degli utenti, l'esempio aggiunge l'attributo `account_lockout_flag` all'`User`entità principale nella richiesta di autorizzazione. Questo flag blocca l'accesso dell'utente al sistema e assegna `DENY` tutti i privilegi all'utente bloccato. L'`account_lockout_flag`attributo è associato all'`User`entità ed è valido `User` fino a quando il flag non viene revocato attivamente in più sessioni. L'esempio utilizza la `when` condizione per valutare`account_lockout_flag`.

L'esempio aggiunge anche dettagli sulla richiesta e sulla sessione. Le informazioni di contesto specificano che la sessione è stata autenticata utilizzando l'autenticazione a più fattori. Per implementare questa convalida, l'esempio utilizza la `when` condizione per valutare il `uses_mfa` flag come parte del campo di contesto. Per ulteriori informazioni sulle migliori pratiche per l'aggiunta di contesto, consulta la documentazione [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
};
```

Questa politica impedisce l'accesso alle risorse a meno che la risorsa non sia nello stesso gruppo dell'attributo del `Tenant` principale richiedente. Questo approccio per mantenere l'isolamento dei tenant è denominato approccio *One Shared Multi-Tenant* Policy Store. Per ulteriori informazioni sulle considerazioni sulla progettazione delle autorizzazioni verificate per applicazioni SaaS multi-tenant, consulta la sezione Considerazioni sulla progettazione multi-tenant [delle autorizzazioni verificate](avp-design-considerations.md).

La politica garantisce inoltre che il preside sia membro e limita le azioni a e. `allAccessRole` `viewData` `updateData` Inoltre, questa politica verifica che lo `account_lockout_flag` sia `false` e che il valore di contesto `uses_mfa` valuti a. `true`

Analogamente, la seguente politica garantisce che sia il principale che la risorsa siano associati allo stesso tenant, impedendo l'accesso tra tenant. Questa politica garantisce inoltre che il preside sia membro di `viewDataRole` e limita le azioni a. `viewData` Inoltre, verifica che il valore `account_lockout_flag` è `false` e che il valore di contesto di sia uguale a`uses_mfa`. `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 terza politica è simile alla precedente. La politica richiede che la risorsa sia un membro del gruppo che corrisponde all'entità rappresentata da`principal.Tenant`. Ciò garantisce che sia il principale che la risorsa siano associati al Tenant B, il che impedisce l'accesso tra tenant. Questa politica garantisce che il committente sia membro di `updateDataRole` e limita le azioni a. `updateData` Inoltre, questo criterio verifica che il valore di `account_lockout_flag` is `false` e il valore di contesto `uses_mfa` valuti a. `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 seguente richiesta di autorizzazione viene valutata in base alle tre politiche illustrate in precedenza in questa sezione. In questa richiesta di autorizzazione, il principale di tipo `User` e con valore di `Alice` effettua una `updateData` richiesta con il ruolo`allAccessRole`. `Alice`ha l'attributo `Tenant` il cui valore è`Tenant::"TenantA"`. L'azione `Alice` che si sta tentando di eseguire è `updateData,` e la risorsa a cui verrà applicata è `SampleData` del tipo`Data`. `SampleData`ha `TenantA` come entità principale. 

In base alla prima politica nell'archivio delle `<DATAMICROSERVICE_POLICYSTOREID>` politiche, `Alice` può eseguire l'`updateData`azione sulla risorsa, presupponendo che siano soddisfatte le condizioni nella `when` clausola della politica. La prima condizione richiede l'`principal.Tenant`attributo su cui eseguire la valutazione. `TenantA` La seconda condizione richiede che l'`account_lockout_flag`attributo principale sia`false`. L'ultima condizione richiede che `uses_mfa` il contesto sia`true`. Poiché tutte e tre le condizioni sono soddisfatte, la richiesta restituisce una `ALLOW` decisione.

```
{
  "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"
            }
        ]
      }
    ]
  }
}
```