As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Exemplo 4: Controle de acesso multilocatário com RBAC e ABAC
Para aprimorar o exemplo de RBAC na seção anterior, você pode adicionar atributos aos usuários para criar uma abordagem híbrida RBAC-ABAC para controle de acesso multilocatário. Esse exemplo inclui as mesmas funções do exemplo anterior, mas adiciona o atributo de usuário account_lockout_flag
e o parâmetro de contextouses_mfa
. O exemplo também adota uma abordagem diferente para implementar o controle de acesso multilocatário usando o RBAC e o ABAC, e usa um repositório de políticas compartilhado em vez de um armazenamento de políticas diferente para cada inquilino.

Este exemplo representa uma solução SaaS multilocatária na qual você precisa fornecer decisões de autorização para o Locatário A e o Locatário B, semelhante ao exemplo anterior.
Para implementar o recurso de bloqueio de usuário, o exemplo adiciona o account_lockout_flag
atributo à User
entidade principal na solicitação de autorização. Esse sinalizador bloqueia o acesso do usuário ao sistema e concede DENY
todos os privilégios ao usuário bloqueado. O account_lockout_flag
atributo está associado à User
entidade e está em vigor User
até que o sinalizador seja revogado ativamente em várias sessões. O exemplo usa a when
condição para avaliaraccount_lockout_flag
.
O exemplo também adiciona detalhes sobre a solicitação e a sessão. As informações de contexto especificam que a sessão foi autenticada usando a autenticação multifatorial. Para implementar essa validação, o exemplo usa a when
condição para avaliar o uses_mfa
sinalizador como parte do campo de contexto. Para obter mais informações sobre as melhores práticas para adicionar contexto, consulte a documentação do 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 };
Essa política impede o acesso aos recursos, a menos que o recurso esteja no mesmo grupo que o Tenant
atributo do principal solicitante. Essa abordagem para manter o isolamento de inquilinos é conhecida como abordagem de um repositório de políticas compartilhado para vários locatários. Para obter mais informações sobre as considerações de design de permissões verificadas para aplicativos SaaS multilocatários, consulte a seção Considerações sobre design de permissões verificadas para vários locatários.
A política também garante que o diretor seja membro allAccessRole
e restringe as ações de viewData
e. updateData
Além disso, essa política verifica se account_lockout_flag
é false
e se o valor do contexto de é uses_mfa
avaliado como. true
Da mesma forma, a política a seguir garante que o principal e o recurso estejam associados ao mesmo inquilino, o que impede o acesso entre inquilinos. Essa política também garante que o diretor seja membro viewDataRole
e restringe as ações a. viewData
Além disso, verifica se o account_lockout_flag
é false
e se o valor do contexto para é uses_mfa
avaliado como. 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 };
A terceira política é semelhante à anterior. A política exige que o recurso seja membro do grupo que corresponde à entidade representada porprincipal.Tenant
. Isso garante que tanto o principal quanto o recurso estejam associados ao Locatário B, o que impede o acesso entre inquilinos. Essa política garante que o diretor seja membro updateDataRole
e restringe as ações a. updateData
Além disso, essa política verifica se o account_lockout_flag
é false
e se o valor do contexto para é uses_mfa
avaliado como. 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 };
A solicitação de autorização a seguir é avaliada pelas três políticas discutidas anteriormente nesta seção. Nessa solicitação de autorização, o principal do tipo User
e com um valor de Alice
faz uma updateData
solicitação com a funçãoallAccessRole
. Alice
tem o atributo Tenant
cujo valor éTenant::"TenantA"
. A ação Alice
que está tentando executar é updateData,
e o recurso ao qual ela será aplicada é SampleData
do tipoData
. SampleData
tem TenantA
como entidade controladora.
De acordo com a primeira <DATAMICROSERVICE_POLICYSTOREID>
política no repositório de políticas, Alice
pode executar a updateData
ação no recurso, supondo que as condições na when
cláusula da política sejam atendidas. A primeira condição exige que o principal.Tenant
atributo seja avaliadoTenantA
. A segunda condição exige que o account_lockout_flag
atributo do principal sejafalse
. A condição final exige que uses_mfa
o contexto sejatrue
. Como todas as três condições foram atendidas, a solicitação retorna uma ALLOW
decisão.
{ "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" } ] } ] } }