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
- Prerequisiti e impostazione
- Implementare il campione di marmo per il controllo dell'accesso con filtro
- Test del controllo dell'accesso
- Riferimento file campione
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 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 denominata
blueMarblesAcl
che fornisce il trasferimento di massa dei marmi blu per l'accesso 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
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.
- 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
). - 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 directoryfgACL_MarbleSampleCC
. Il contenuto della directoryfgACL_MarbleSampleCC
sarà il filefgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
ego.mod
e la directoryoracle.com
. - Dalla riga di comando, andare alla directory
fgACL_MarbleSampleCC
ed 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.mod
e le directoryvendor
eoracle.com
) della directoryfgACL_MarbleSampleCC
in formato ZIP. Il codice concatenato è pronto per essere distribuito su Blockchain Platform.
- Estrarre il contenuto del file
- 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 directoryfgACL_MarbleSampleCC
. I contenuti della directoryfgACL_MarbleSampleCC
sono:fgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
e la directoryvendor
. - Da una riga di comando, andare alla directory
fgACL_MarbleSampleCC
ed eseguiregovendor sync
. Verrà scaricata la dipendenza richiesta (github.com/op/go-logging
) e aggiunta alla directoryvendor
. - Comprimere tutti i contenuti (i quattro file Go e la directory
vendor
) della directoryfgACL_MarbleSampleCC
in formato ZIP. Il codice concatenato è pronto per essere distribuito su Blockchain Platform.
- Installa govendor:
- Installare e distribuire il package di codici concatenati di esempio aggiornato (
fgACL_MarbleSampleCC.zip
), come descritto in Usa distribuzione rapida. - Nella scheda Strumenti sviluppatore aprire il riquadro Sviluppo applicazioni, quindi seguire le istruzioni per scaricare l'SDK Node.js.
- Nella scheda Strumenti sviluppatore aprire il riquadro Sviluppo applicazioni, quindi fare clic su Scarica il package di sviluppo.
- Estrarre il package di sviluppo nella stessa cartella con i file Node.js scaricati con l'esempio.
- Nel file
network.yaml
, cercare la vocecertificateAuthorities
e la relativa voceregistrar
. La password dell'amministratore viene mascherata (convertita in***
) nel filenetwork.yaml
al momento del download. Deve essere sostituita con la password in chiaro dell'amministratore quando si esegue questo esempio.
- Registrare una nuova identità con l'istanza di Blockchain Platform:
- Creare un nuovo utente in IDCS (definito
<NewIdentity>
nei passi riportati di seguito) nell'IDCS mappato alla tenancy. - Assegnare a questo utente il ruolo applicazione
CA_User
per l'istanza.
- Creare un nuovo utente in IDCS (definito
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.
- Iscriviti al nuovo utente:
node registerEnrollUser.js <NewIdentity> <Password>
- Inizializzazione: inizializzare le liste di controllo dell'accesso.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
- 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
- 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.
- 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
- 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
- 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
- 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
- Trasferisci tutti i marmi rossi come utente amministrativo: l'identità amministrativa non dispone dell'attributo Fabric
"redMarblesTransferPermission=true"
, pertanto l'ACLredMarblesAcl
deve 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 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
- 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
- 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 |
|
Ottenere un'ACL denominata o leggere tutte le ACL. L'utente che richiama il metodo deve disporre dell'accesso READ all'ACL denominata. |
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 deve esistere l'ACL denominata. |
addAfterACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata. |
addBeforeACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata. |
addPatternToACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata. |
removePatternFromACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata. |
updateDescription |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata. |
removeBindACL |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata. |
addAccess |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata. |
removeAccess |
|
L'utente che richiama il metodo deve disporre dell'accesso UPDATE alla risorsa denominata e deve esistere l'ACL denominata. |
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. |