Amostra de Mármores de Controle de Acesso Refinado
O aplicativo de chaincode de mármores permite que você crie ativos (mármore) com atributos exclusivos (nome, tamanho, cor e proprietário) e troque esses ativos com outros participantes em uma rede blockchain.
Este aplicativo de amostra inclui uma variedade de funções para permitir que você examine como trabalhar com listas de controle de acesso e grupos para restringir funções a determinados usuários.
- Visão Geral da Amostra
- Pré-requisitos e Configuração
- Implementar a Amostra de Mármore de Controle de Acesso Refinado
- Testando o Controle de Acesso
- Referência dos Arquivos de Amostra
Visão Geral da Amostra
O cenário de teste incluído na amostra contém as seguintes restrições para gerenciar ativos:
- A transferência em massa de mármores vermelhos só é permitida por identidades que têm o atributo
"redMarblesTransferPermission"
Fabric. - A transferência em massa de mármores azuis só é permitida por identidades que têm o atributo
"blueMarblesTransferPermission"
Fabric. - A exclusão de mármores só é permitida para identidades com o atributo
"deleteMarblePermission"
Fabric.
Essas restrições são impostas pela implementação dos seguintes métodos de biblioteca no chaincode fgMarbles_chaincode.go
:
- Crie um grupo de ACL detalhado denominado
bulkMarblesTransferGroup
. Este grupo definirá todas as identidades que podem transferir mármores com base na cor (transferências em massa):createGroup(stub, []string{" bulkMarblesTransferGroup", "List of Identities allowed to Transfer Marbles in Bulk", "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
- Crie uma ACL refinada denominada
redMarblesAcl
, que permite transferência em massa de acesso aos mármores vermelhos parabulkMarblesTransferGroup
:createACL(stub, []string{"redMarblesAcl", "ACL to control who can transfer red marbles in bulk", "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
- Crie uma ACL refinada denominada
blueMarblesAcl
que permite transferência em massa de acesso aos mármores azuis abulkMarblesTransferGroup
:createACL(stub, []string{"blueMarblesAcl", "ACL to control who can transfer blue marbles in bulk", "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
- Crie uma ACL refinada denominada
deleteMarbleAcl
para restringir a exclusão de mármore com base no atributo Fabric"canDeleteMarble=true"
:createACL(stub, []string{"deleteMarbleAcl", "ACL to control who can Delete a Marble", "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
- Crie um recurso de ACL detalhado chamado
marble
, cujas operações são controladas usando as várias ACLs que criamos:createResource(stub, []string{"marble", "System marble resource", "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})
Pré-requisitos e Configuração
Para executar a versão refinada do controle de acesso da amostra de mármores, execute estas etapas:
- Baixe a versão refinada do controle de acesso da amostra de mármores. Na guia Ferramentas do Desenvolvedor, abra o painel Amostras e clique no link de download em Mármore com ACLs Detalhadas. Extraia esse pacote, que contém arquivos ZIP da amostra de mármores (
fgACL_MarbleSampleCC.zip
), arquivos Node.js para executar a amostra (fgACL-NodeJSCode.zip
) e a biblioteca de controle de acesso refinada (Fine-GrainedAccessControlLibrary.zip
). - Gere o pacote chaincode que será implantado no Blockchain Platform:
- Extraia o conteúdo do arquivo
fgACL_MarbleSampleCC.zip
para o diretóriofgACL_MarbleSampleCC
. O conteúdo do diretóriofgACL_MarbleSampleCC
será os arquivosfgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
ego.mod
e o diretóriooracle.com
. - Na linha de comando, vá para o diretório
fgACL_MarbleSampleCC
e executeGO111MODULE=on go mod vendor
. Esse comando faz download das dependências necessárias e as adiciona ao diretóriovendor
. - Compacte todo o conteúdo (os quatro arquivos Go, o arquivo
go.mod
e os diretóriosvendor
eoracle.com
) do diretóriofgACL_MarbleSampleCC
no formato ZIP. Seu chaincode está pronto para ser implantado no Blockchain Platform.
- Extraia o conteúdo do arquivo
- Instale e implante o pacote de chaincode de amostra atualizado (
fgACL_MarbleSampleCC.zip
), conforme descrito em Usar Implantação Rápida. - Na guia Developer Tools, abra o painel Desenvolvimento de Aplicativos e siga as instruções para fazer download do SDK Node.js.
- Na guia Developer Tools, abra o painel Desenvolvimento de Aplicativos e clique em Fazer download do pacote de desenvolvimento.
- Extraia o pacote de desenvolvimento na mesma pasta com os arquivos Node.js baixados com a amostra.
- No arquivo
network.yaml
, procure a entradacertificateAuthorities
e sua entradaregistrar
. A senha do administrador é mascarada (convertida em***
) nonetwork.yaml
quando submetido a download. Ela deve ser substituída pela senha de texto não criptografado do administrador ao executar essa amostra.
- Registre uma nova identidade com sua instância do Blockchain Platform:
- Crie um novo usuário no IDCS (conhecido como
<NewIdentity>
nas etapas a seguir) no IDCS mapeado para sua tenancy. - Dê a esse usuário a atribuição de aplicativo
CA_User
para sua instância.
- Crie um novo usuário no IDCS (conhecido como
Implementar a Amostra de Mármore de Controle de Acesso Refinado
Siga as etapas abaixo para inscrever seu novo usuário e implementar as restrições de ACL usando os scripts Node.js fornecidos.
- Registrar o novo usuário:
node registerEnrollUser.js <NewIdentity> <Password>
- Inicialização: Inicialize as listas de controle de acesso.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
- Crie as listas de controle de acesso, os grupos e os recursos: Isso cria os recursos de ACL descritos na visão geral.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
- Crie seus recursos de mármore de teste: Isso cria vários ativos de mármore de teste - blue1 e blue2 de propriedade de tom, red1 e red2 de propriedade de jerry e green1 e green2 de propriedade de spike.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles
Testando o Controle de Acesso
Para testar se nossas listas de controle de acesso permitem que apenas os usuários corretos executem cada função, execute alguns exemplos de cenários.
- Transferir um mármore: Transfira o mármore
blue1
de tom para jerry. Como não há restrições sobre quem pode transferir um único mármore, isso deve ser concluído com sucesso.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
- Transferir um mármore como usuário administrativo: Transfira o mármore
blue1
de jerry para spike. Como não há restrições sobre quem pode transferir um único mármore, isso também deve ser concluído com sucesso.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
- Obter histórico: Consulte o histórico do mármore chamado
blue1
. Deve retornar que foi transferido primeiro para jerry, em seguida, para pico.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
- Transferir todos os mármores vermelhos: A ACL de
redMarblesAcl
deve permitir essa transferência porque a identidade recém-registrada tem o atributo"redMarblesTransferPermission=true"
Fabric necessário, de modo que os dois mármores vermelhos devem ser transferidos para tom.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
- Transferir todos os mármores vermelhos como usuário administrativo: a identidade administrativa não tem o atributo
"redMarblesTransferPermission=true"
Fabric, portanto, a ACLredMarblesAcl
deve bloquear essa transferência.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
- Transferir todos os mármores verdes: Por padrão, apenas o acesso definido explicitamente é permitido. Como não há um ACL que permita a transferência em massa de mármores verdes, isso deve falhar.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
- Excluir um mármore: a ACL
deleteMarbleAcl
permite essa exclusão porque a identidade recém-registrada tem o atributo Fabric"deleteMarblePermission=true"
necessário.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
- Excluir um mármore como o usuário administrativo: a ACL
deleteMarbleAcl
deve impedir essa exclusão porque a identidade administrativa não tem o atributo Fabric"deleteMarblePermission=true"
necessário.node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2
Referência dos Arquivos de Amostra
Essas tabelas listam os métodos disponíveis no chaincode e nos arquivos de aplicativo incluídos na amostra.
fgMarbles_chaincode.go
Função | Descrição |
---|---|
initMarble |
Criar um novo mármore |
transferMarble |
Transferir um mármore de um proprietário para outro com base no nome |
createTestMarbles |
Chama initMarble para criar novos mármores de amostra para fins de teste
|
createFineGrainedAclSampleResources |
Cria a lista detalhada de controle de acesso (ACL), os grupos e os recursos exigidos por nosso cenário de teste |
transferMarblesBasedOnColor |
Transfere vários mármores de uma determinada cor para outro proprietário |
delete |
Excluir um mármore |
readMarble |
Retorna todos os atributos de um mármore com base no nome |
getHistoryForMarble |
Retorna um histórico de valores para um mármore |
fgACL_Operations.go
Métodos | Parâmetros | Descrição |
---|---|---|
getACL |
|
Obtenha uma ACL nomeada ou leia todas as ACLs. O usuário que chama o método deve ter acesso READ à ACL nomeada. |
createACL |
|
Para criar uma nova ACL, o usuário que chama o método precisa ter acesso CREATE ao recurso de bootstrap chamado ". ACLs" . ACLs nomeadas duplicadas não são permitidas
|
deleteACL |
|
O usuário que chama o método deve ter acesso DELETE à ACL nomeada. |
updateACL |
|
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
addAfterACL |
|
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
addBeforeACL |
|
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
addPatternToACL |
|
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
removePatternFromACL |
|
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
updateDescription |
|
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
removeBindACL |
|
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
addAccess |
|
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
removeAccess |
|
O usuário que chama o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
ACLInitialization |
|
Esta função é usada para inicializar o suporte refinado à ACL. |
fgGroups_Operations.go
Métodos | Parâmetros | Descrição |
---|---|---|
getGroup |
|
Se name= O usuário que chama o método deve ter acesso READ a este grupo. |
createGroup |
|
Retorna O usuário que chama o método deve ter acesso CREATE ao grupo de bootstrap |
deleteGroup |
|
O usuário que chama o método deve ter acesso DELETE a este grupo. |
addAfterGroup |
|
O usuário que chama o método deve ter acesso UPDATE a esse grupo. |
addBeforeGroup |
|
O usuário que chama o método deve ter acesso UPDATE a esse grupo. |
updateDescriptionForGroup |
|
O usuário que chama o método deve ter acesso UPDATE a esse grupo. |
removeBindAclFromGroup |
|
O usuário que chama o método deve ter acesso UPDATE a esse grupo. |
addMembersToGroup |
|
O usuário que chama o método deve ter acesso UPDATE a esse grupo. |
removeMembersFromGroup |
|
O usuário que chama o método deve ter acesso UPDATE a esse grupo. |
fgResource_Operations.go
Métodos | Parâmetros | Descrição |
---|---|---|
createResource |
|
O usuário que chama o método precisa ter acesso CREATE ao recurso de bootstrap chamado ". Resources" . Não são permitidos recursos nomeados duplicados.
|
getResource |
|
O usuário que chama o método deve ter acesso READ ao recurso |
deleteResource |
|
O usuário que chama o método deve ter acesso DELETE ao recurso nomeado |
addAfterACLInResource |
|
O usuário que chama o método deve ter acesso UPDATE a este recurso |
addBeforeACLInResource |
|
O usuário que chama o método deve ter acesso UPDATE a este recurso |
updateDescriptionInResource |
|
O usuário que chama o método deve ter acesso UPDATE a este recurso |
removeBindACLInResource |
|
O usuário que chama o método deve ter acesso UPDATE a este recurso |
checkResourceAccess |
|
Verifica se o usuário atual que chama o método tem o acesso especificado ao recurso nomeado. |