Campione di marmi di controllo di accesso con filtro

L'applicazione codice concatenato di marmi consente di creare asset (marmi) con attributi univoci (nome, dimensione, colore e proprietario) e scambiare queste risorse con altri partecipanti in una rete blockchain.

Questa applicazione di esempio include una vasta gamma di funzioni per consentire di esaminare come utilizzare le liste e i gruppi di controllo dell'accesso per limitare le funzioni a determinati utenti.

Panoramica dell'esempio

Lo scenario di test incluso nel campione contiene le seguenti limitazioni per la gestione degli asset:

  • Il trasferimento in blocco dei marmi rossi è consentito solo dalle identità con l'attributo Fabric "redMarblesTransferPermission".
  • Il trasferimento di massa di marmi blu è consentito solo dalle identità con l'attributo Fabric "blueMarblesTransferPermission".
  • L'eliminazione dei marmi è consentita solo alle identità con l'attributo Fabric "deleteMarblePermission".

Queste limitazioni vengono applicate implementando i metodi della libreria riportati di seguito nel codice concatenato fgMarbles_chaincode.go.

  • Creare un gruppo di ACL con filtro denominato bulkMarblesTransferGroup. Questo gruppo definirà tutte le identità che possono trasferire i marmi in base al colore (trasferimenti di massa):
    createGroup(stub, []string{" bulkMarblesTransferGroup", 
    "List of Identities allowed to Transfer Marbles in Bulk", 
    "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
  • Creare un'ACL con filtro denominata redMarblesAcl che fornisce il trasferimento in blocco dei marmi rossi per l'accesso a bulkMarblesTransferGroup:
    createACL(stub, []string{"redMarblesAcl", 
    "ACL to control who can transfer red marbles in bulk", 
    "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • Creare un'ACL con filtro denominata blueMarblesAcl che fornisce il trasferimento di massa dei marmi blu per l'accesso a bulkMarblesTransferGroup:
    createACL(stub, []string{"blueMarblesAcl", 
    "ACL to control who can transfer blue marbles in bulk", 
    "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
  • Creare un'ACL con filtro denominato deleteMarbleAcl per limitare l'eliminazione del marmo in base all'attributo Fabric "canDeleteMarble=true":
    createACL(stub, []string{"deleteMarbleAcl", 
    "ACL to control who can Delete a Marble", 
    "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
  • Creare una risorsa ACL con filtro denominata marble, le cui operazioni sono controllate utilizzando le varie ACL create:
    createResource(stub, []string{"marble", 
    "System marble resource", 
    "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})

Prerequisiti e impostazione

Per eseguire la versione con filtro di controllo dell'accesso del campione di marmi, attenersi alla procedura riportata di seguito.

  1. Scaricare la versione con filtro di controllo dell'accesso del campione di marmi. Nella scheda Strumenti di sviluppo aprire il riquadro Esempi, quindi fare clic sul collegamento di download in Marmi con ACL con filtro. Estrai questo pacchetto: contiene file ZIP dell'esempio di marmi (fgACL_MarbleSampleCC.zip), file Node.js per eseguire l'esempio (fgACL-NodeJSCode.zip) e la libreria di controllo dell'accesso con filtro (Fine-GrainedAccessControlLibrary.zip).
  2. Solo Hyperledger Fabric v2.x: genera il package codice concatenato che verrà distribuito nella piattaforma Blockchain:
    • Estrarre il contenuto del file fgACL_MarbleSampleCC.zip nella directory fgACL_MarbleSampleCC. Il contenuto della directory fgACL_MarbleSampleCC sarà il file fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go, fgResource_Operations.go e go.mod e la directory oracle.com.
    • Dalla riga di comando, andare alla directory fgACL_MarbleSampleCC ed eseguire GO111MODULE=on go mod vendor. Questo comando scarica le dipendenze richieste e le aggiunge alla directory vendor.
    • Comprimere tutti i contenuti (i quattro file Go, il file go.mod e le directory vendor e oracle.com) della directory fgACL_MarbleSampleCC in formato ZIP. Il codice concatenato è pronto per essere distribuito su Blockchain Platform.
  3. Solo Hyperledger Fabric v1.4.7: genera il package codice concatenato che verrà distribuito nella piattaforma Blockchain:
    • Installa govendor:
      go get -u github.com/kardianos/govendor
    • Estrarre il contenuto di fgACL_MarbleSampleCC.zip nella directory fgACL_MarbleSampleCC. I contenuti della directory fgACL_MarbleSampleCC sono: fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go, fgResource_Operations.go e la directory vendor.
    • Da una riga di comando, andare alla directory fgACL_MarbleSampleCC ed eseguire govendor sync. Verrà scaricata la dipendenza richiesta (github.com/op/go-logging) e aggiunta alla directory vendor.
    • Comprimere tutti i contenuti (i quattro file Go e la directory vendor) della directory fgACL_MarbleSampleCC in formato ZIP. Il codice concatenato è pronto per essere distribuito su Blockchain Platform.
  4. Installare e distribuire il package di codici concatenati di esempio aggiornato (fgACL_MarbleSampleCC.zip), come descritto in Usa distribuzione rapida.
  5. Nella scheda Strumenti sviluppatore aprire il riquadro Sviluppo applicazioni, quindi seguire le istruzioni per scaricare l'SDK Node.js.
  6. Nella scheda Strumenti sviluppatore aprire il riquadro Sviluppo applicazioni, quindi fare clic su Scarica il package di sviluppo.
    1. Estrarre il package di sviluppo nella stessa cartella con i file Node.js scaricati con l'esempio.
    2. Nel file network.yaml, cercare la voce certificateAuthorities e la relativa voce registrar. La password dell'amministratore viene mascherata (convertita in ***) nel file network.yaml al momento del download. Deve essere sostituita con la password in chiaro dell'amministratore quando si esegue questo esempio.
  7. Registrare una nuova identità con l'istanza di Blockchain Platform:
    1. Creare un nuovo utente in IDCS (definito <NewIdentity> nei passi riportati di seguito) nell'IDCS mappato alla tenancy.
    2. Assegnare a questo utente il ruolo applicazione CA_User per l'istanza.

Implementare il campione di marmo per il controllo dell'accesso con filtro

La procedura riportata di seguito consente di registrare il nuovo utente e implementare le limitazioni ACL utilizzando gli script Node.js forniti.

  1. Iscriviti al nuovo utente:
    node registerEnrollUser.js <NewIdentity> <Password>
  2. Inizializzazione: inizializzare le liste di controllo dell'accesso.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
  3. Creare le liste di controllo dell'accesso, i gruppi e le risorse: in questo modo vengono create le risorse ACL descritte nella panoramica.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. Creare le risorse di marmo di prova: vengono creati diversi asset di marmo di prova: blue1 e blue2 di proprietà di tom, red1 e red2 di proprietà di jerry e green1 e green2 di proprietà di spike.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles

Test del controllo dell'accesso

Per verificare che le nostre liste di controllo degli accessi consentano solo agli utenti corretti di eseguire ogni funzione, eseguiamo alcuni scenari di esempio.

  1. Trasferimento di un marmo: stiamo trasferendo il marmo blue1 da tom a jerry. Poiché non ci sono restrizioni su chi può trasferire un singolo marmo, questo dovrebbe essere completato con successo.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
  2. Trasferisci un marmo come utente amministrativo: stiamo trasferendo il marmo blue1 da jerry a spike. Dal momento che non ci sono restrizioni su chi può trasferire un singolo marmo, questo dovrebbe anche completare con successo.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
  3. Ottieni cronologia: verrà eseguita una query sulla cronologia del marmo denominato blue1. Dovrebbe tornare che è stato trasferito prima a jerry poi a spike.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
  4. Trasferisci tutti i marmi rossi: l'ACL redMarblesAcl deve consentire questo trasferimento perché l'identità appena registrata dispone dell'attributo "redMarblesTransferPermission=true" Fabric richiesto, pertanto i due marmi rossi devono essere trasferiti a Tom.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
  5. Trasferisci tutti i marmi rossi come utente amministrativo: l'identità amministrativa non dispone dell'attributo Fabric "redMarblesTransferPermission=true", pertanto l'ACL redMarblesAcl deve bloccare questo trasferimento.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
  6. Trasferisci tutti i marmi verdi: per impostazione predefinita, è consentito solo l'accesso definito in modo esplicito. Poiché non esiste un ACL che consente il trasferimento di massa di marmi verdi, questo dovrebbe fallire.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
  7. Eliminare un marmo: l'ACL deleteMarbleAcl consente questa eliminazione poiché l'identità appena registrata dispone dell'attributo Fabric "deleteMarblePermission=true" richiesto.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
  8. Eliminare un marmo come utente amministrativo: l'ACL deleteMarbleAcl deve impedire questa eliminazione poiché l'identità amministrativa non dispone dell'attributo Fabric "deleteMarblePermission=true" richiesto.
    node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2

Riferimento file campione

In queste tabelle sono elencati i metodi disponibili nei file di codice concatenato e di applicazione inclusi nell'esempio.

fgMarbles_chaincode.go

Funzione Descrizione
initMarble Crea un nuovo marmo
transferMarble Trasferisci un marmo da un proprietario a un altro in base al nome
createTestMarbles Chiama initMarble per creare nuovi marmi campione a scopo di test
createFineGrainedAclSampleResources Crea la lista di controllo dell'accesso con filtro (ACL), i gruppi e le risorse richiesti dal nostro scenario di test
transferMarblesBasedOnColor Trasferisce più marmi di un certo colore a un altro proprietario
delete Eliminare un marmo
readMarble Restituisce tutti gli attributi di un marmo in base al nome
getHistoryForMarble Restituisce una cronologia dei valori per un marmo

fgACL_Operations.go

Metodi Parametri Descrizione
getACL
  • name
Ottenere un'ACL denominata o leggere tutte le ACL. L'utente che richiama il metodo deve disporre dell'accesso READ all'ACL denominata.
createACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
  • Identity_Certificate
Per creare una nuova ACL, l'utente che richiama il metodo deve disporre dell'accesso CREATE alla risorsa bootstrap denominata ". ACLs". ACL denominate duplicate non consentite
deleteACL
  • name
L'utente che richiama il metodo deve disporre dell'accesso DELETE all'ACL denominata.
updateACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata.
addAfterACL
  • aclName
  • existingBindAclName
  • newBindAclName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata.
addBeforeACL
  • aclName
  • existingBindAclName
  • newBindAclName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata.
addPatternToACL
  • aclName
  • BindPattern
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata.
removePatternFromACL
  • aclName
  • BindPattern
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata.
updateDescription
  • aclName
  • newDesc
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata.
removeBindACL
  • aclName
  • bindAclNameToRemove
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata.
addAccess
  • aclName
  • accessName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata.
removeAccess
  • aclName
  • accessName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata.
ACLInitialization
  • nessuno
Questa funzione viene utilizzata per inizializzare il supporto dell'ACL con filtro.

fgGroups_Operations.go

Metodi Parametri Descrizione
getGroup
  • name

Se name="GetAll", restituisce tutti i gruppi a cui ha accesso l'identità. In caso contrario, restituisce i dettagli dei singoli gruppi (se accessibili) in base al nome.

L'utente che richiama il metodo deve disporre dell'accesso READ a questo gruppo.

createGroup
  • name
  • description
  • patterns
  • bindACLs

Restituisce success o error.

L'utente che richiama il metodo deve disporre dell'accesso CREATE al gruppo bootstrap ". Group"

deleteGroup
  • name
L'utente che richiama il metodo deve disporre dell'accesso DELETE a questo gruppo.
addAfterGroup
  • groupName
  • existingBindAclName
  • newBindAclName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo.
addBeforeGroup
  • groupName
  • existingBindAclName
  • newBindAclName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo.
updateDescriptionForGroup
  • groupName
  • newDesc
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo.
removeBindAclFromGroup
  • groupName
  • bindAclNameToRemove
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo.
addMembersToGroup
  • groupName
  • pattern
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo.
removeMembersFromGroup
  • groupName
  • pattern
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo.

fgResource_Operations.go

Metodi Parametri Descrizione
createResource
  • name
  • description
  • bindACLs
L'utente che richiama il metodo deve disporre dell'accesso CREATE alla risorsa bootstrap denominata ". Resources". Le risorse denominate duplicate non sono consentite.
getResource
  • name
L'utente che richiama il metodo deve disporre dell'accesso READ alla risorsa
deleteResource
  • name
L'utente che richiama il metodo deve disporre dell'accesso DELETE alla risorsa denominata
addAfterACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questa risorsa
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questa risorsa
updateDescriptionInResource
  • ResourceName
  • newDesc
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questa risorsa
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questa risorsa
checkResourceAccess
  • ResourceName
  • access
Verifica se l'utente corrente che richiama il metodo dispone dell'accesso specificato alla risorsa denominata.