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
- Prerequisiti e impostazione
- Implementare l'esempio di marmo di controllo dell'accesso con filtro
- Test del controllo dell'accesso
- Riferimento file di esempio
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
redMarblesAclche fornisce il trasferimento di massa dell'accesso ai marmi rossi abulkMarblesTransferGroup: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
blueMarblesAclche fornisce il trasferimento di massa dell'accesso ai marmi blu abulkMarblesTransferGroup: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
deleteMarbleAclper 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:
- 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). - Genera il package del codice concatenato che verrà distribuito sulla piattaforma Blockchain:
- Estrarre il contenuto del file
fgACL_MarbleSampleCC.zipnella directoryfgACL_MarbleSampleCC. I contenuti della directoryfgACL_MarbleSampleCCsaranno i filefgACL_Operations.go,fgGroups_Operations.go,fgMarbles_chaincode.go,fgResource_Operations.go,go.mode la directoryoracle.com. - Dalla riga di comando, andare alla directory
fgACL_MarbleSampleCCed eseguireGO111MODULE=on go mod vendor. Questo comando scarica le dipendenze richieste e le aggiunge alla directoryvendor. - Comprimere tutti i contenuti (i quattro file Go, il file
go.mode le directoryvendoreoracle.com) della directoryfgACL_MarbleSampleCCin formato ZIP. Il tuo codice concatenato è pronto per essere distribuito su Blockchain Platform.
- Estrarre il contenuto del file
- Installare e distribuire il pacchetto aggiornato del codice concatenato di esempio (
fgACL_MarbleSampleCC.zip) come descritto in Usa distribuzione rapida. - Nella scheda Strumenti per sviluppatori aprire il riquadro Sviluppo applicazioni, quindi seguire le istruzioni per scaricare l'SDK Node.js.
- Nella scheda Strumenti per sviluppatori aprire il riquadro Sviluppo applicazioni, quindi fare clic su Scarica il pacchetto di sviluppo.
- Estrarre il pacchetto di sviluppo nella stessa cartella con i file Node.js scaricati con l'esempio.
- Nel file
network.yaml, cercare la vocecertificateAuthoritiese la relativa voceregistrar. La password dell'amministratore viene mascherata (convertita in***) innetwork.yamlquando viene scaricata. Quando si esegue questo esempio, è necessario sostituirlo con la password di testo in chiaro dell'amministratore.
- Registrare una nuova identità con l'istanza della piattaforma Blockchain:
- Creare un nuovo utente in IDCS (indicato come
<NewIdentity>nei passi riportati di seguito) nell'IDCS mappato alla tenancy. - Assegnare a questo utente il ruolo applicazione
CA_Userper l'istanza.
- Creare un nuovo utente in IDCS (indicato come
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.
- Iscrivi nuovo utente:
node registerEnrollUser.js <NewIdentity> <Password> - Inizializzazione: inizializzare le liste di controllo dell'accesso.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization - 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 - 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.
- Trasferisci un marmo: trasferisci il marmo
blue1dal 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 - Trasferire un marmo come utente amministrativo: trasferire il marmo
blue1da 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 - 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 - Trasferisci tutti i marmi rossi: l'ACL
redMarblesAcldeve 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 - Trasferire tutti i marmi rossi come utente amministrativo: l'identità amministrativa non dispone dell'attributo Fabric
"redMarblesTransferPermission=true", pertanto l'ACLredMarblesAcldeve bloccare questo trasferimento.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry - 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 - Elimina un marmo: l'ACL
deleteMarbleAclconsente l'eliminazione perché la nuova identità registrata contiene l'attributo Fabric"deleteMarblePermission=true"richiesto.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1 - Eliminare un marmo come utente amministrativo: l'ACL
deleteMarbleAcldeve 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 |
|
Ottenere un'ACL denominata o leggere tutte le ACL. L'utente che richiama il metodo deve disporre dell'accesso READ all'ACL indicata. |
createACL |
|
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 |
|
L'utente che richiama il metodo deve disporre dell'accesso DELETE all'ACL denominata. |
updateACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere. |
addAfterACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere. |
addBeforeACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere. |
addPatternToACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere. |
removePatternFromACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere. |
updateDescription |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere. |
removeBindACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere. |
addAccess |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere. |
removeAccess |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e l'ACL denominata deve esistere. |
ACLInitialization |
|
Questa funzione viene utilizzata per inizializzare il supporto dell'ACL con filtro. |
fgGroups_Operations.go
| Metodi | Parametri | Descrizione |
|---|---|---|
getGroup |
|
Se name= L'utente che richiama il metodo deve disporre dell'accesso READ a questo gruppo. |
createGroup |
|
Restituisce L'utente che richiama il metodo deve disporre dell'accesso CREATE al gruppo bootstrap |
deleteGroup |
|
L'utente che richiama il metodo deve disporre dell'accesso DELETE a questo gruppo. |
addAfterGroup |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo. |
addBeforeGroup |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo. |
updateDescriptionForGroup |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo. |
removeBindAclFromGroup |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo. |
addMembersToGroup |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo. |
removeMembersFromGroup |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questo gruppo. |
fgResource_Operations.go
| Metodi | Parametri | Descrizione |
|---|---|---|
createResource |
|
L'utente che richiama il metodo deve disporre dell'accesso CREATE alla risorsa bootstrap denominata ". Resources". Le risorse denominate duplicate non sono consentite.
|
getResource |
|
L'utente che richiama il metodo deve disporre dell'accesso READ alla risorsa |
deleteResource |
|
L'utente che richiama il metodo deve disporre dell'accesso DELETE alla risorsa denominata |
addAfterACLInResource |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questa risorsa |
addBeforeACLInResource |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questa risorsa |
updateDescriptionInResource |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questa risorsa |
removeBindACLInResource |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE a questa risorsa |
checkResourceAccess |
|
Verifica se l'utente corrente che richiama il metodo dispone dell'accesso specificato alla risorsa denominata. |