Esempio di marmi con controllo dell'accesso con filettatura fine

L'applicazione marbles chaincode 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 varie funzioni che consentono di esaminare come utilizzare le liste e i gruppi di controllo dell'accesso per limitare le funzioni a determinati utenti.

Panoramica del campione

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

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

Queste limitazioni vengono applicate implementando i metodi della libreria seguenti nel codice concatenato fgMarbles_chaincode.go:

  • Creare un gruppo ACL con filtro denominato bulkMarblesTransferGroup. Questo gruppo definirà tutte le identità che possono trasferire 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 denominato redMarblesAcl che fornisce il trasferimento di massa dell'accesso ai marmi rossi 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 denominato blueMarblesAcl che fornisce il trasferimento di massa dell'accesso ai marmi blu 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, operazioni su cui vengono 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 seguente procedura:

  1. Scarica la versione con filtro di controllo dell'accesso del campione di biglie. Nella scheda Strumenti per sviluppatori, aprire il riquadro Esempi, quindi fare clic sul collegamento di download in Marmi con ACL con filtro. Estrarre questo pacchetto, che contiene i file ZIP dell'esempio di biglie (fgACL_MarbleSampleCC.zip), i file Node.js per l'esecuzione dell'esempio (fgACL-NodeJSCode.zip) e la libreria di controllo dell'accesso con filtro (Fine-GrainedAccessControlLibrary.zip).
  2. Genera il package del codice concatenato che verrà distribuito sulla piattaforma Blockchain:
    • Estrarre il contenuto del file fgACL_MarbleSampleCC.zip nella directory fgACL_MarbleSampleCC. I contenuti della directory fgACL_MarbleSampleCC saranno i file fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go,fgResource_Operations.go, 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 tuo codice concatenato è pronto per essere distribuito su Blockchain Platform.
  3. Installare e distribuire il pacchetto aggiornato del codice concatenato di esempio (fgACL_MarbleSampleCC.zip) come descritto in Usa distribuzione rapida.
  4. Nella scheda Strumenti per sviluppatori aprire il riquadro Sviluppo applicazioni, quindi seguire le istruzioni per scaricare l'SDK Node.js.
  5. Nella scheda Strumenti per sviluppatori aprire il riquadro Sviluppo applicazioni, quindi fare clic su Scarica il pacchetto di sviluppo.
    1. Estrarre il pacchetto 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 ***) in network.yaml quando viene scaricata. Quando si esegue questo esempio, è necessario sostituirlo con la password di testo in chiaro dell'amministratore.
  6. Registrare una nuova identità con l'istanza della piattaforma Blockchain:
    1. Creare un nuovo utente in IDCS (indicato come <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 l'esempio di marmo di controllo dell'accesso con filtro

Per iscrivere il nuovo utente e implementare le limitazioni ACL utilizzando gli script Node.js forniti, attenersi alla procedura riportata di seguito.

  1. Iscrivi 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. Creazione delle liste di controllo dell'accesso, dei gruppi e delle risorse: in questo modo vengono create le risorse ACL descritte nella panoramica.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. Crea le tue risorse di marmo di prova: crea 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 dell'accesso consentano solo agli utenti corretti di eseguire ciascuna funzione, eseguire alcuni scenari di esempio.

  1. Trasferisci un marmo: trasferisci il marmo blue1 dal tom alla 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. Trasferire un marmo come utente amministrativo: trasferire il marmo blue1 da jerry a spike. Poiché non ci sono restrizioni su chi può trasferire un singolo marmo, anche questo dovrebbe essere completato con successo.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
  3. Ottieni cronologia: esegue 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é la nuova identità registrata ha l'attributo Fabric "redMarblesTransferPermission=true" richiesto, quindi i due marmi rossi devono essere trasferiti a tom.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
  5. Trasferire 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 c'è 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. Elimina un marmo: l'ACL deleteMarbleAcl consente l'eliminazione perché la nuova identità registrata contiene l'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 l'eliminazione perché l'identità amministrativa non dispone dell'attributo Fabric "deleteMarblePermission=true" richiesto.
    node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2

Riferimento file di esempio

Queste tabelle elencano i metodi disponibili nei file di codice concatenato e applicazione inclusi nell'esempio.

fgMarbles_chaincode.go

Funzione Descrizione
initMarble Crea un nuovo marmo
transferMarble Trasferire 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 richieste dallo scenario di test
transferMarblesBasedOnColor Trasferisce più marmi di un certo colore a un altro proprietario
delete Elimina un marmo
readMarble Restituisce tutti gli attributi di un marmo in base al nome
getHistoryForMarble Restituisce una cronologia di 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 indicata.
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 l'ACL denominata deve esistere.
addAfterACL
  • aclName
  • existingBindAclName
  • newBindAclName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere.
addBeforeACL
  • aclName
  • existingBindAclName
  • newBindAclName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere.
addPatternToACL
  • aclName
  • BindPattern
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere.
removePatternFromACL
  • aclName
  • BindPattern
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere.
updateDescription
  • aclName
  • newDesc
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere.
removeBindACL
  • aclName
  • bindAclNameToRemove
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere.
addAccess
  • aclName
  • accessName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere.
removeAccess
  • aclName
  • accessName
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere.
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 l'identità ha accesso. Altrimenti, restituisce i dettagli del singolo gruppo (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.