Amostra de Mármores de Controle de Acesso Refinado
O aplicativo de chaincode de mármores permite que você crie ativos (marbles) 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 e grupos de controle de acesso a fim de 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 tenham o atributo
"redMarblesTransferPermission"
Fabric. - A transferência em massa de mármores azuis só é permitida por identidades que tenham 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 a 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 denominada
blueMarblesAcl
, que permite a transferência em massa de acessos 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 refinada denominada
deleteMarbleAcl
para restringir a exclusão de mármore com base no atributo"canDeleteMarble=true"
do Fabric:createACL(stub, []string{"deleteMarbleAcl", "ACL to control who can Delete a Marble", "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
- Crie um recurso de ACL detalhado denominado
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, conclua estas etapas:
- Faça download da 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 Mariáveis com ACLs Detalhadas. Extraia este pacote - ele 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
). - Somente Hyperledger Fabric v2.x: Gere o pacote de 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
- Somente Hyperledger Fabric v1.4.7: Gere o pacote de chaincode que será implantado no Blockchain Platform:
- Instalar fornecedor:
go get -u github.com/kardianos/govendor
- Extraia o conteúdo de
fgACL_MarbleSampleCC.zip
para o diretóriofgACL_MarbleSampleCC
. O conteúdo do diretóriofgACL_MarbleSampleCC
seria:fgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
e o diretóriovendor
. - Em uma linha de comando, vá para o diretório
fgACL_MarbleSampleCC
e executegovendor sync
. Isso fará download da dependência necessária (github.com/op/go-logging
) e a adicionará ao diretóriovendor
. - Compacte todo o conteúdo (os quatro arquivos Go e o diretório
vendor
) do diretóriofgACL_MarbleSampleCC
no formato ZIP. Seu chaincode está pronto para ser implantado no Blockchain Platform.
- Instalar fornecedor:
- Instale e implante o pacote de chaincode de amostra atualizado (
fgACL_MarbleSampleCC.zip
), conforme descrito em Usar Implantação Rápida. - Na guia Ferramentas do Desenvolvedor, abra o painel Desenvolvimento de Aplicativos e siga as instruções para fazer download do SDK Node.js.
- Na guia Ferramentas do 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 entradacertificateAuthorities
e sua entradaregistrar
. A senha do administrador é mascarada (convertida para***
) nonetwork.yaml
quando o download é feito. Ela deve ser substituída pela senha de texto não criptografado do administrador ao executar esta 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. - Atribua 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
As etapas a seguir inscreverão seu novo usuário e implementarão as restrições de ACL usando os scripts Node.js fornecidos.
- Inscreva 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 estão permitindo apenas que os usuários corretos executem cada função, veremos alguns exemplos de cenários.
- Transferir um mármore: Estamos transferindo 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 o usuário administrativo: Estamos transferindo 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: Agora consultaremos o histórico do mármore chamado
blue1
. Deveria retornar que foi transferido primeiro para jerry e depois para spike.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
- Transferir todos os mármores vermelhos: A ACL
redMarblesAcl
deve permitir essa transferência porque a identidade recém-registrada tem o atributo"redMarblesTransferPermission=true"
Fabric necessário; portanto, os dois mármores vermelhos devem ser 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"
do 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, somente o acesso definido explicitamente é permitido. Como não há uma 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"deleteMarblePermission=true"
Fabric 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"deleteMarblePermission=true"
Fabric 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 de controle de acesso refinada (ACL), grupos e 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 |
|
Essa função é usada para inicializar o suporte à ACL refinada. |
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 esse 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 este grupo. |
addBeforeGroup |
|
O usuário que chama o método deve ter acesso UPDATE a este grupo. |
updateDescriptionForGroup |
|
O usuário que chama o método deve ter acesso UPDATE a este grupo. |
removeBindAclFromGroup |
|
O usuário que chama o método deve ter acesso UPDATE a este grupo. |
addMembersToGroup |
|
O usuário que chama o método deve ter acesso UPDATE a este grupo. |
removeMembersFromGroup |
|
O usuário que chama o método deve ter acesso UPDATE a este 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. |