Fine-Grained Access Control Marbles Beispiel
Mit der marbles chaincode-Anwendung können Sie Assets (Murmeln) mit eindeutigen Attributen (Name, Größe, Farbe und Eigentümer) erstellen und diese Assets mit anderen Teilnehmern in einem Blockchain-Netzwerk austauschen.
Diese Beispielanwendung enthält eine Vielzahl von Funktionen, mit denen Sie untersuchen können, wie Sie mit Access Control-Listen und -Gruppen arbeiten, um Funktionen auf bestimmte Benutzer einzuschränken.
- Überblick über die Probe
- Voraussetzungen und Setup
- Implementieren Sie das Fine-Grained Access Control-Marmorbeispiel
- Zugriffskontrolle testen
- Referenz für Beispieldateien
Überblick über die Probe
Das im Beispiel enthaltene Testszenario enthält die folgenden Einschränkungen für die Verwaltung von Assets:
- Die Bulkübertragung von roten Murmeln ist nur durch Identitäten mit dem Fabric-Attribut
"redMarblesTransferPermission"
zulässig. - Bulk-Übertragung von blauen Murmeln ist nur durch Identitäten mit dem Fabric-Attribut
"blueMarblesTransferPermission"
zulässig. - Das Löschen von Murmeln ist nur für Identitäten mit dem Fabric-Attribut
"deleteMarblePermission"
zulässig.
Diese Einschränkungen werden durch Implementierung der folgenden Bibliotheksmethoden im fgMarbles_chaincode.go
-Kettencode durchgesetzt:
- Erstellen Sie eine feingranulierte ACL-Gruppe mit dem Namen
bulkMarblesTransferGroup
. Diese Gruppe definiert alle Identitäten, die Murmeln basierend auf Farbe übertragen können (Massenübertragungen):createGroup(stub, []string{" bulkMarblesTransferGroup", "List of Identities allowed to Transfer Marbles in Bulk", "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
- Erstellen Sie eine feingranulierte ACL mit dem Namen
redMarblesAcl
, die eine Bulkübertragung von roten Murmeln mit Zugriff aufbulkMarblesTransferGroup
ermöglicht:createACL(stub, []string{"redMarblesAcl", "ACL to control who can transfer red marbles in bulk", "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
- Erstellen Sie eine feingranulierte ACL mit dem Namen
blueMarblesAcl
, die eine Bulkübertragung von blauen Marmorzugriff aufbulkMarblesTransferGroup
ermöglicht:createACL(stub, []string{"blueMarblesAcl", "ACL to control who can transfer blue marbles in bulk", "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
- Erstellen Sie eine feingranulierte ACL mit dem Namen
deleteMarbleAcl
, um das Löschen von Marmor basierend auf dem Fabric-Attribut"canDeleteMarble=true"
einzuschränken:createACL(stub, []string{"deleteMarbleAcl", "ACL to control who can Delete a Marble", "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
- Erstellen Sie eine feingranulierte ACL-Ressource mit dem Namen
marble
. Vorgänge, die mit den verschiedenen von uns erstellten ACLs gesteuert werden:createResource(stub, []string{"marble", "System marble resource", "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})
Voraussetzungen und Setup
Führen Sie die folgenden Schritte aus, um die fein granulierte Version der Zugriffskontrolle der Marmorprobe auszuführen:
- Laden Sie die feingranulierte Version der Zugriffskontrolle des Murmelbeispiels herunter. Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Beispiele, und klicken Sie unter Murmeln mit fein granulierten ACLs auf den Downloadlink. Extrahieren Sie dieses Package. Es enthält ZIP-Dateien der Murmeln-Beispieldateien (
fgACL_MarbleSampleCC.ZIP
), Node.js-Dateien zur Ausführung des Beispiels (fgACL-NodeJSCode.ZIP
) und die feingranulierte Zugriffskontrollbibliothek (Fine-GrainedAccessControlLibrary.ZIP
). - Nur Hyperledger Fabric v2.x: Generieren Sie das Chaincode-Package, das auf Blockchain Platform bereitgestellt wird:
- Extrahieren Sie den Inhalt der Datei
fgACL_MarbleSampleCC.zip
in das VerzeichnisfgACL_MarbleSampleCC
. Der Inhalt des VerzeichnissesfgACL_MarbleSampleCC
ist die DateifgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
undgo.mod
sowie das Verzeichnisoracle.com
. - Gehen Sie in der Befehlszeile zum Verzeichnis
fgACL_MarbleSampleCC
, und führen SieGO111MODULE=on go mod vendor
aus. Dieser Befehl lädt die erforderlichen Abhängigkeiten herunter und fügt sie dem Verzeichnisvendor
hinzu. - Komprimieren Sie den gesamten Inhalt (die vier Go-Dateien, die Datei
go.mod
und die Verzeichnissevendor
undoracle.com
) des VerzeichnissesfgACL_MarbleSampleCC
im ZIP-Format. Ihr Chaincode kann auf der Blockchain Platform bereitgestellt werden.
- Extrahieren Sie den Inhalt der Datei
- Nur Hyperledger Fabric v1.4.7: Generieren Sie das Chaincode-Package, das auf Blockchain Platform bereitgestellt wird:
- Hersteller installieren:
go get -u github.com/kardianos/govendor
- Extrahieren Sie den Inhalt von
fgACL_MarbleSampleCC.zip
in das VerzeichnisfgACL_MarbleSampleCC
. Der Inhalt des VerzeichnissesfgACL_MarbleSampleCC
lautet:fgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
und das Verzeichnisvendor
. - Gehen Sie über eine Befehlszeile in das Verzeichnis
fgACL_MarbleSampleCC
, und führen Siegovendor sync
aus. Dadurch wird die erforderliche Abhängigkeit (github.com/op/go-logging
) heruntergeladen und zum Verzeichnisvendor
hinzugefügt. - Komprimieren Sie den gesamten Inhalt (die vier Go-Dateien und das Verzeichnis
vendor
) des VerzeichnissesfgACL_MarbleSampleCC
im ZIP-Format. Ihr Chaincode kann auf der Blockchain Platform bereitgestellt werden.
- Hersteller installieren:
- Installieren und stellen Sie das aktualisierte Beispiel-Chaincode-Package (
fgACL_MarbleSampleCC.zip
) bereit, wie unter Schnelles Deployment verwenden beschrieben. - Öffnen Sie auf der Registerkarte Entwicklertools den Bereich Anwendungsentwicklung, und befolgen Sie die Anweisungen zum Herunterladen des Node.js-SDK.
- Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Anwendungsentwicklung, und klicken Sie auf Entwicklungspaket herunterladen.
- Extrahieren Sie das Entwicklungspaket in denselben Ordner mit den Node.js-Dateien, die mit dem Beispiel heruntergeladen wurden.
- Suchen Sie in der Datei
network.yaml
nach dem EintragcertificateAuthorities
und dem zugehörigen Eintragregistrar
. Das Administratorkennwort wird beim Herunterladen innetwork.yaml
maskiert (in***
konvertiert). Er sollte bei der Ausführung dieses Beispiels durch das Klartextpasswort des Administrators ersetzt werden.
- Registrieren Sie eine neue Identität bei Ihrer Blockchain Platform-Instanz:
- Erstellen Sie einen neuen Benutzer in IDCS (in den folgenden Schritten als
<NewIdentity>
bezeichnet) in dem IDCS, das Ihrem Mandanten zugeordnet ist. - Weisen Sie diesem Benutzer die Anwendungsrolle
CA_User
für Ihre Instanz zu.
- Erstellen Sie einen neuen Benutzer in IDCS (in den folgenden Schritten als
Implementieren Sie das Fine-Grained Access Control-Marmorbeispiel
Mit den folgenden Schritten wird der neue Benutzer registriert und die ACL-Einschränkungen mit den bereitgestellten Node.js-Skripten implementiert.
- Registrieren Sie den neuen Benutzer:
node registerEnrollUser.js <NewIdentity> <Password>
- Initialisierung: Initialisieren Sie die Access Control-Listen.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
- Access-Control-Listen, Gruppen und Ressourcen erstellen: Dadurch werden die im Überblick beschriebenen ACL-Ressourcen erstellt.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
- Erstellen Sie Ihre Testmarmorressourcen: Dadurch werden mehrere Testmarmorassets erstellt: blue1 und blue2 im Besitz von tom, red1 und red2 im Besitz von jerry und green1 und green2 im Besitz von spike.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles
Zugriffskontrolle testen
Um zu testen, ob unsere Access-Control-Listen nur den richtigen Benutzern erlauben, jede Funktion auszuführen, werden einige Beispielszenarien durchlaufen.
- Marmor übertragen: Wir übertragen Marmor
blue1
von Tom zu Jerry. Da es keine Einschränkungen gibt, wer einen einzelnen Marmor übertragen kann, sollte dies erfolgreich abgeschlossen werden.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
- Marmor als administrativer Benutzer übertragen: Wir übertragen Marmor
blue1
von Jerry zu Spike. Da es keine Einschränkungen gibt, wer einen einzelnen Marmor übertragen kann, sollte dies auch erfolgreich abgeschlossen werden.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
- Historie abrufen: Jetzt wird die Historie des Marmors mit dem Namen
blue1
abgefragt. Es sollte zurückkehren, dass es zuerst an Jerry und dann an Spike übertragen wurde.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
- Übertragen Sie alle roten Murmeln: Die
redMarblesAcl
-ACL muss diese Übertragung zulassen, weil die neu registrierte Identität das erforderliche"redMarblesTransferPermission=true"
-Fabric-Attribut aufweist, sodass die beiden roten Murmeln an tom übertragen werden müssen.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
- Übertragen Sie alle roten Murmeln als administrativen Benutzer: Die administrative Identität hat nicht das
"redMarblesTransferPermission=true"
Fabric-Attribut. Daher sollte dieredMarblesAcl
-ACL diese Übertragung blockieren.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
- Alle grünen Murmeln übertragen: Standardmäßig ist nur explizit definierter Zugriff zulässig. Da es keine ACL gibt, die eine Massenübertragung von grünen Murmeln ermöglicht, sollte dies fehlschlagen.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
- Marmor löschen: Die
deleteMarbleAcl
-ACL lässt diesen Löschvorgang zu, da die neu registrierte Identität das erforderliche"deleteMarblePermission=true"
-Fabric-Attribut aufweist.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
- Marmor als administrativen Benutzer löschen: Die
deleteMarbleAcl
-ACL muss diesen Löschvorgang verhindern, weil die administrative Identität nicht das erforderliche"deleteMarblePermission=true"
-Fabric-Attribut aufweist.node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2
Referenz für Beispieldateien
In diesen Tabellen werden die Methoden aufgeführt, die im Chaincode und in den Anwendungsdateien im Beispiel verfügbar sind.
fgMarbles_chaincode.go
Funktion | Beschreibung |
---|---|
initMarble |
Erstellen Sie einen neuen Marmor |
transferMarble |
Übertragen Sie einen Marmor von einem Eigentümer zum anderen basierend auf dem Namen |
createTestMarbles |
Ruft initMarble auf, um neue Beispielmurmeln zu Testzwecken zu erstellen
|
createFineGrainedAclSampleResources |
Erstellt die fein granulierte Access Control-Liste (ACL), Gruppen und Ressourcen, die für unser Testszenario erforderlich sind |
transferMarblesBasedOnColor |
Überträgt mehrere Murmeln einer bestimmten Farbe an einen anderen Eigentümer |
delete |
Löschen eines Marmors |
readMarble |
Gibt alle Attribute eines Marmors basierend auf dem Namen zurück |
getHistoryForMarble |
Gibt eine Historie der Werte für einen Marmor zurück |
fgACL_Operations.go
Methoden | Parameter | Beschreibung |
---|---|---|
getACL |
|
Rufen Sie eine benannte ACL ab, oder lesen Sie alle ACLs. Der Benutzer, der die Methode aufruft, muss READ-Zugriff auf die benannte ACL haben. |
createACL |
|
Um eine neue ACL zu erstellen, muss der Benutzer, der die Methode aufruft, CREATE-Zugriff auf die Bootstrap-Ressource namens ". ACLs" haben. Doppelte benannte ACLs sind nicht zulässig
|
deleteACL |
|
Der Benutzer, der die Methode aufruft, muss DELETE-Zugriff auf die benannte ACL haben. |
updateACL |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein. |
addAfterACL |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein. |
addBeforeACL |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein. |
addPatternToACL |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein. |
removePatternFromACL |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein. |
updateDescription |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein. |
removeBindACL |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein. |
addAccess |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein. |
removeAccess |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf die benannte Ressource haben, und die benannte ACL muss vorhanden sein. |
ACLInitialization |
|
Mit dieser Funktion wird die feingranulierte ACL-Unterstützung initialisiert. |
fgGroups_Operations.go
Methoden | Parameter | Beschreibung |
---|---|---|
getGroup |
|
Wenn name= Der Benutzer, der die Methode aufruft, muss READ-Zugriff auf diese Gruppe haben. |
createGroup |
|
Gibt Der Benutzer, der die Methode aufruft, muss CREATE-Zugriff auf die Bootstrap-Gruppe |
deleteGroup |
|
Der Benutzer, der die Methode aufruft, muss DELETE-Zugriff auf diese Gruppe haben. |
addAfterGroup |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben. |
addBeforeGroup |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben. |
updateDescriptionForGroup |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben. |
removeBindAclFromGroup |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben. |
addMembersToGroup |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben. |
removeMembersFromGroup |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Gruppe haben. |
fgResource_Operations.go
Methoden | Parameter | Beschreibung |
---|---|---|
createResource |
|
Der Benutzer, der die Methode aufruft, muss CREATE-Zugriff auf die Bootstrap-Ressource mit dem Namen ". Resources" haben. Doppelte benannte Ressourcen sind nicht zulässig.
|
getResource |
|
Der Benutzer, der die Methode aufruft, muss READ-Zugriff auf die Ressource haben |
deleteResource |
|
Der Benutzer, der die Methode aufruft, muss DELETE-Zugriff auf die benannte Ressource haben |
addAfterACLInResource |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Ressource haben |
addBeforeACLInResource |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Ressource haben |
updateDescriptionInResource |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Ressource haben |
removeBindACLInResource |
|
Der Benutzer, der die Methode aufruft, muss UPDATE-Zugriff auf diese Ressource haben |
checkResourceAccess |
|
Prüft, ob der aktuelle Benutzer, der die Methode aufruft, über den angegebenen Zugriff auf die benannte Ressource verfügt. |