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 handeln.
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 die Fine-Grained Access Control Marble-Beispiel
- Zugriffskontrolle testen
- Referenz für Beispieldateien
Überblick über die Probe
Das im Beispiel enthaltene Testszenario enthält die folgenden Einschränkungen, um Assets zu verwalten:
- Die Massenübertragung roter Murmeln ist nur durch Identitäten mit dem Fabric-Attribut
"redMarblesTransferPermission"
zulässig. - Bulk-Transfer von blauen Murmeln ist nur durch Identitäten mit dem Fabric-Attribut
"blueMarblesTransferPermission"
zulässig. - Das Löschen von Marbles ist nur für Identitäten mit dem
"deleteMarblePermission"
Fabric-Attribut zulässig.
Diese Einschränkungen werden durch die Implementierung der folgenden Bibliotheksmethoden im fgMarbles_chaincode.go
-Kettencode erzwungen:
- Erstellen Sie eine feingranulierte ACL-Gruppe namens
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 einen Bulk-Transfer von Red Marbles-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 einen Bulk-Transfer von Blue Marbles-Zugriff 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 namens
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
Gehen Sie folgendermaßen vor, um die fein granulierte Zugriffskontrollversion des Marbles-Beispiels auszuführen:
- Laden Sie die fein granulierte Zugriffskontrollversion des Marbles-Beispiels herunter. Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Beispiele, und klicken Sie unter Marbles mit fein granulierten ACLs auf den Downloadlink. Extrahieren Sie dieses Package, das ZIP-Dateien des Marbles-Beispiels (
fgACL_MarbleSampleCC.zip
), Node.js-Dateien zum Ausführen des Beispiels (fgACL-NodeJSCode.zip
) und die fein granulierte Zugriffskontrollbibliothek (Fine-GrainedAccessControlLibrary.zip
) enthält. - Generieren Sie das Chaincode-Paket, das in 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 über die Befehlszeile zum Verzeichnis
fgACL_MarbleSampleCC
, und führen SieGO111MODULE=on go mod vendor
aus. Mit diesem Befehl werden die erforderlichen Abhängigkeiten heruntergeladen und dem Verzeichnisvendor
hinzugefügt. - 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 ist bereit für die Bereitstellung auf der Blockchain Platform.
- Extrahieren Sie den Inhalt der Datei
- Installieren und stellen Sie das aktualisierte Beispiel-Chaincode-Package (
fgACL_MarbleSampleCC.zip
) bereit, wie unter Schnell-Deployment verwenden beschrieben. - Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Anwendungsentwicklung, und befolgen Sie die Anweisungen zum Herunterladen des SDK Node.js.
- Öffnen Sie auf der Registerkarte Entwicklungstools den Bereich Anwendungsentwicklung, und klicken Sie auf Entwicklungspaket herunterladen.
- Extrahieren Sie das Entwicklungspackage mit den mit dem Beispiel heruntergeladenen Node.js-Dateien in denselben Ordner.
- Suchen Sie in der Datei
network.yaml
nach dem EintragcertificateAuthorities
und dem Eintragregistrar
. Das Administratorkennwort wird beim Herunterladen in der Dateinetwork.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. - Geben Sie diesem Benutzer die Anwendungsrolle
CA_User
für Ihre Instanz.
- Erstellen Sie einen neuen Benutzer in IDCS (in den folgenden Schritten als
Implementieren Sie die Fine-Grained Access Control Marble-Beispiel
Gehen Sie folgendermaßen vor, um den neuen Benutzer zu registrieren und die ACL-Einschränkungen mit den bereitgestellten Node.js-Skripten zu implementieren.
- Melden Sie den neuen Benutzer an:
node registerEnrollUser.js <NewIdentity> <Password>
- Initialisierung: Initialisieren Sie die Access Control-Listen.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
- Erstellen Sie die Access Control-Listen, -Gruppen und -Ressourcen: 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, die zu tom gehören, red1 und red2, die zu jerry gehören, und green1 und green2, die zu spike gehören.
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, führen Sie einige Beispielszenarios durch.
- Marmor übertragen: Übertragen Sie Marmor
blue1
von Tom auf 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
- Übertragen Sie einen Marmor als administrativen Benutzer: Übertragen Sie 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: Fragen Sie die Historie des Marmors mit dem Namen
blue1
ab. Es sollte zurückkehren, dass es zuerst auf Jerry und dann auf Spike übertragen wurde.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
- Alle roten Murmeln übertragen: Die ACL
redMarblesAcl
sollte diese Übertragung zulassen, da die neu registrierte Identität das erforderliche"redMarblesTransferPermission=true"
-Fabric-Attribut aufweist. Daher sollten die beiden roten Murmeln an tom übertragen werden.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
- Übertragen Sie alle roten Marbles als Admin-Benutzer: Die administrative Identität hat nicht das Fabric-Attribut
"redMarblesTransferPermission=true"
. Daher sollte die ACLredMarblesAcl
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 ACL
deleteMarbleAcl
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 administrativer Benutzer löschen: Die ACL
deleteMarbleAcl
sollte diesen Löschvorgang verhindern, da 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 im Chaincode und in den Anwendungsdateien des Beispiels verfügbaren Methoden aufgeführt.
fgMarbles_chaincode.go
Funktion | Beschreibung |
---|---|
initMarble |
Erstellen Sie einen neuen Marmor |
transferMarble |
Übertragen Sie einen Marmor von einem Besitzer auf einen anderen basierend auf dem Namen |
createTestMarbles |
Ruft initMarble auf, um neue Beispiel-Marbles zu Testzwecken zu erstellen
|
createFineGrainedAclSampleResources |
Erstellt die feingranulierte 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 Besitzer |
delete |
Marmor löschen |
readMarble |
Gibt alle Attribute eines Marmors basierend auf dem Namen zurück |
getHistoryForMarble |
Gibt eine Werthistorie 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 mit dem Namen ". 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 fein granulierte 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 über 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 über UPDATE-Zugriff auf diese Gruppe verfügen. |
addBeforeGroup |
|
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen. |
updateDescriptionForGroup |
|
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen. |
removeBindAclFromGroup |
|
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen. |
addMembersToGroup |
|
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen. |
removeMembersFromGroup |
|
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Gruppe verfügen. |
fgResource_Operations.go
Methoden | Parameter | Beschreibung |
---|---|---|
createResource |
|
Der Benutzer, der die Methode aufruft, muss CREATE-Zugriff auf die Bootstrap-Ressource namens ". 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 über UPDATE-Zugriff auf diese Ressource verfügen |
addBeforeACLInResource |
|
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Ressource verfügen |
updateDescriptionInResource |
|
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Ressource verfügen |
removeBindACLInResource |
|
Der Benutzer, der die Methode aufruft, muss über UPDATE-Zugriff auf diese Ressource verfügen |
checkResourceAccess |
|
Prüft, ob der aktuelle Benutzer, der die Methode aufruft, den angegebenen Zugriff auf die benannte Ressource hat. |