Amostra de Mármores de Controle de Acesso Detalhado
O aplicativo chaincode de bolinhas permite criar ativos (bolinhas) com atributos exclusivos (nome, tamanho, cor e proprietário) e trocar 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 e grupos de controle de acesso 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 Detalhado
- Testando o Controle de Acesso
- Referência de 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 com o atributo
"redMarblesTransferPermission"Fabric. - A transferência em massa de mármores azuis só é permitida por identidades com 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 implementando os seguintes métodos de biblioteca no chaincode fgMarbles_chaincode.go:
- Crie um grupo de ACL detalhado chamado
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 chamada
redMarblesAcl, que fornece transferência em massa de acesso de 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 chamada
blueMarblesAcl, que fornece transferência em massa de acesso de mármores azuis parabulkMarblesTransferGroup:createACL(stub, []string{"blueMarblesAcl", "ACL to control who can transfer blue marbles in bulk", "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"}) - Crie uma ACL detalhada chamada
deleteMarbleAclpara restringir a exclusão de mármore com base no atributo do 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, operações nas quais 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:
- Faça download da versão refinada do controle de acesso da amostra de mármores. Na página Ferramentas de Desenvolvedor, abra o painel Amostras e clique no link de download em Marbles com ACLs Detalhadas. Extraia este pacote, que contém arquivos
.zipda 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 Oracle Blockchain Platform:
- Extraia o conteúdo do arquivo
fgACL_MarbleSampleCC.zippara o diretóriofgACL_MarbleSampleCC. O conteúdo do diretóriofgACL_MarbleSampleCCserá os arquivosfgACL_Operations.go,fgGroups_Operations.go,fgMarbles_chaincode.go,fgResource_Operations.goego.mode o diretóriooracle.com. - Na linha de comando, vá para o diretório
fgACL_MarbleSampleCCe 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.mode os diretóriosvendoreoracle.com) do diretóriofgACL_MarbleSampleCCno formato ZIP. Seu chaincode está pronto para ser implantado no Oracle 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 página Ferramentas de Desenvolvedor, abra o painel Desenvolvimento de Aplicativos e siga as instruções para fazer download do SDK Node.js.
- Na página Ferramentas de Desenvolvedor, abra o painel Desenvolvimento de Aplicativos e clique em Fazer Download do pacote de desenvolvimento.
- Extraia o pacote de desenvolvimento para a mesma pasta com os arquivos Node.js baixados com a amostra.
- No arquivo
network.yaml, procure a entradacertificateAuthoritiese sua entradaregistrar. A senha do administrador é mascarada (convertida para***) nonetwork.yamlquando é feito download. Substitua essa senha pela senha de texto não criptografado do administrador ao executar essa amostra.
- Registre uma nova identidade com sua instância do Oracle Blockchain Platform:
- Crie um usuário no IDCS (conhecido como
<NewIdentity>nas etapas a seguir) no IDCS mapeado para sua tenancy. - Atribua a esse usuário a atribuição de aplicativo
CA_Userà sua instância.
- Crie um usuário no IDCS (conhecido como
Implementar a Amostra de Mármore de Controle de Acesso Detalhado
Siga as etapas abaixo para inscrever seu novo usuário e implementar as restrições de ACL usando os scripts Node.js fornecidos.
- Inscrever 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 da ACL descritos na visão geral.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources - Crie seus recursos de teste de mármore: Isso cria vários ativos de teste de mármore - 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 estão permitindo que apenas os usuários corretos executem cada função, execute alguns exemplos de cenários.
- Transferir um mármore: Transfira o mármore
blue1do tom para o jerry. Como não há restrições sobre quem pode transferir um único mármore, isso é concluído com sucesso.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry - Transferir um mármore como o usuário administrativo: Transfira o mármore
blue1de jerry para spike. Como não há restrições sobre quem pode transferir um único mármore, isso também é 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. Ele retorna 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
redMarblesAclpermite essa transferência porque a identidade recém-registrada tem o atributo Fabric"redMarblesTransferPermission=true"necessário, portanto, os dois mármores vermelhos serão transferidos para o tom.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom - Transferir todos os mármores vermelhos como o usuário administrativo: A identidade administrativa não tem o atributo
"redMarblesTransferPermission=true"Fabric, portanto, a ACLredMarblesAclbloqueia essa transferência.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry - Transferir todos os mármores verdes: Por padrão, somente o acesso definido explicitamente é permitido. Como não há um ACL que permita a transferência em massa de mármores verdes, isso falha.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom - Excluir um mármore: A ACL
deleteMarbleAclpermite 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 usuário administrativo: A ACL
deleteMarbleAclimpede 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 de Arquivos de Amostra
Essas tabelas listam os métodos disponíveis no chaincode e nos arquivos de aplicativo incluídos no exemplo.
fgMarbles_chaincode.go
| Função | Descrição |
|---|---|
initMarble |
Criar um mármore |
transferMarble |
Transferir um mármore de um proprietário para outro com base no nome |
createTestMarbles |
Chama o initMarble para criar mármores de amostra para fins de teste
|
createFineGrainedAclSampleResources |
Cria a lista de controle de acesso (ACL) refinada, grupos e recursos exigidos pelo 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 |
|
Obter uma ACL nomeada ou ler todas as ACLs. O usuário que está chamando o método deve ter acesso READ à ACL nomeada. |
createACL |
|
Para criar uma ACL, o usuário que está chamando o método deve ter acesso CREATE ao recurso de bootstrap chamado ". ACLs". Não são permitidas ACLs nomeadas duplicadas
|
deleteACL |
|
O usuário que está chamando o método deve ter acesso DELETE à ACL nomeada. |
updateACL |
|
O usuário que está chamando o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
addAfterACL |
|
O usuário que está chamando o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
addBeforeACL |
|
O usuário que está chamando o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
addPatternToACL |
|
O usuário que está chamando o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
removePatternFromACL |
|
O usuário que está chamando o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
updateDescription |
|
O usuário que está chamando o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
removeBindACL |
|
O usuário que está chamando o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
addAccess |
|
O usuário que está chamando o método deve ter acesso UPDATE ao recurso nomeado, e a ACL nomeada deve existir. |
removeAccess |
|
O usuário que está chamando 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 de ACL detalhado. |
fgGroups_Operations.go
| Métodos | Parâmetros | Descrição |
|---|---|---|
getGroup |
|
Se name= O usuário que está chamando o método deve ter acesso READ a este grupo. |
createGroup |
|
Retorna O usuário que está chamando o método deve ter acesso CREATE ao grupo de inicialização |
deleteGroup |
|
O usuário que está chamando o método deve ter acesso DELETE a este grupo. |
addAfterGroup |
|
O usuário que está chamando o método deve ter acesso UPDATE a este grupo. |
addBeforeGroup |
|
O usuário que está chamando o método deve ter acesso UPDATE a este grupo. |
updateDescriptionForGroup |
|
O usuário que está chamando o método deve ter acesso UPDATE a este grupo. |
removeBindAclFromGroup |
|
O usuário que está chamando o método deve ter acesso UPDATE a este grupo. |
addMembersToGroup |
|
O usuário que está chamando o método deve ter acesso UPDATE a este grupo. |
removeMembersFromGroup |
|
O usuário que está chamando o método deve ter acesso UPDATE a este grupo. |
fgResource_Operations.go
| Métodos | Parâmetros | Descrição |
|---|---|---|
createResource |
|
O usuário que está chamando o método deve ter acesso CREATE ao recurso de bootstrap chamado ". Resources". Recursos nomeados duplicados não são permitidos.
|
getResource |
|
O usuário que está chamando o método deve ter acesso READ ao recurso |
deleteResource |
|
O usuário que está chamando o método deve ter acesso DELETE ao recurso nomeado |
addAfterACLInResource |
|
O usuário que está chamando o método deve ter acesso UPDATE a este recurso |
addBeforeACLInResource |
|
O usuário que está chamando o método deve ter acesso UPDATE a este recurso |
updateDescriptionInResource |
|
O usuário que está chamando o método deve ter acesso UPDATE a este recurso |
removeBindACLInResource |
|
O usuário que está chamando o método deve ter acesso UPDATE a este recurso |
checkResourceAccess |
|
Verifica se o usuário atual que está chamando o método tem o acesso especificado ao recurso nomeado. |