Campione di marmi per il controllo dell'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 del controllo dell'accesso del campione di marmi, effettuare le operazioni riportate di seguito.

  1. Scarica la versione con filtro di controllo dell'accesso del campione di biglie. Nella pagina 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. Generare il package del codice concatenato che verrà distribuito in Oracle Blockchain Platform:
    • 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 Oracle Blockchain Platform.
  3. Installare e distribuire il package di codici concatenati di esempio aggiornato (fgACL_MarbleSampleCC.zip), come descritto in Usa distribuzione rapida.
  4. Nella pagina Strumenti per sviluppatori aprire il riquadro Sviluppo applicazioni, quindi seguire le istruzioni per scaricare l'SDK Node.js.
  5. Nella pagina Strumenti per sviluppatori 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 ***) in network.yaml quando viene scaricata. Sostituire questa password con la password di testo in chiaro dell'amministratore durante l'esecuzione di questo esempio.
  6. Registrare una nuova identità con l'istanza di Oracle Blockchain Platform:
    1. Creare un 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 il campione di marmo con filtro per il controllo dell'accesso

Completare i passi riportati di seguito per registrare il nuovo utente e implementare le limitazioni ACL utilizzando gli script Node.js forniti.

  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. 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 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 viene 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 viene 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. Ritorna 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 consente questo trasferimento perché la nuova identità registrata ha l'attributo Fabric "redMarblesTransferPermission=true" richiesto, quindi i due marmi rossi verranno 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 blocca 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 fallisce.
    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 impedisce 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 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 marmo
transferMarble Trasferisci un marmo da un proprietario a un altro in base al nome
createTestMarbles Chiama initMarble per creare 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 chiama il metodo deve disporre dell'accesso READ all'ACL indicata.
createACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
  • Identity_Certificate
Per creare un'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 chiama 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 ha accesso l'identità. In caso contrario, restituisce i dettagli dei singoli gruppi (se accessibili) in base al nome.

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

createGroup
  • name
  • description
  • patterns
  • bindACLs

Restituisce success o error.

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

deleteGroup
  • name
L'utente che chiama 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 chiama 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 chiama il metodo dispone dell'accesso specificato alla risorsa denominata.