Fein granulierte Zugriffkontrolle - Beispiel für Marbles
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.
- Übersicht über die Probe
- Voraussetzungen und Setup
- Implementieren Sie das fein granulierte Marmorbeispiel für die Zugriffskontrolle
- Zugriffskontrolle testen
- Referenz für Beispieldateien
Übersicht über die Probe
Das Testszenario im Beispiel enthält die folgenden Einschränkungen für die Verwaltung von Assets:
- Die Massenübertragung von roten Murmeln ist nur durch Identitäten mit dem Fabric-Attribut
"redMarblesTransferPermission"zulässig. - Die Massenübertragung 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 Fabric-Attribut
"deleteMarblePermission"zulässig.
Diese Einschränkungen werden durch Implementierung der folgenden Bibliotheksmethoden im Chaincode fgMarbles_chaincode.go durchgesetzt:
- Erstellen Sie eine fein granulierte 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 fein granulierte ACL mit dem Namen
redMarblesAcl, die einen Bulk-Transfer von Red Marbles-Zugriff aufbulkMarblesTransferGroupermöglicht:createACL(stub, []string{"redMarblesAcl", "ACL to control who can transfer red marbles in bulk", "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"}) - Erstellen Sie eine fein granulierte ACL mit dem Namen
blueMarblesAcl, die einen Bulk-Transfer von Blue Marbles-Zugriff aufbulkMarblesTransferGroupermöglicht:createACL(stub, []string{"blueMarblesAcl", "ACL to control who can transfer blue marbles in bulk", "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"}) - Erstellen Sie eine fein granulierte 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 fein granulierte 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
Gehen Sie folgendermaßen vor, um die feingranulierte Version der Zugriffskontrolle des Marbles-Beispiels auszuführen:
- Laden Sie die fein granulierte Version der Zugriffskontrolle des Murmeln-Beispiels herunter. Öffnen Sie auf der Seite Entwicklertools 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 der fein granulierten Zugriffskontrollbibliothek (Fine-GrainedAccessControlLibrary.zip) enthält. - Generieren Sie das Chaincode-Package, das in Oracle Blockchain Platform bereitgestellt wird:
- Extrahieren Sie den Inhalt der Datei
fgACL_MarbleSampleCC.zipin das VerzeichnisfgACL_MarbleSampleCC. Der Inhalt desfgACL_MarbleSampleCC-Verzeichnisses sind die DateienfgACL_Operations.go,fgGroups_Operations.go,fgMarbles_chaincode.go,fgResource_Operations.goundgo.modund das Verzeichnisoracle.com. - Wechseln Sie in der Befehlszeile zum Verzeichnis
fgACL_MarbleSampleCC, und führen SieGO111MODULE=on go mod vendoraus. Mit diesem Befehl werden die erforderlichen Abhängigkeiten heruntergeladen und zum Verzeichnisvendorhinzugefügt. - Komprimieren Sie den gesamten Inhalt (die vier Go-Dateien, die Datei
go.modund die Verzeichnissevendorundoracle.com) des VerzeichnissesfgACL_MarbleSampleCCim ZIP-Format. Ihr Chaincode kann auf der Oracle Blockchain Platform bereitgestellt werden.
- Extrahieren Sie den Inhalt der Datei
- Installieren und implementieren Sie das aktualisierte Beispiel-Chaincode-Package (
fgACL_MarbleSampleCC.zip), wie unter Schnell-Deployment verwenden beschrieben. - Öffnen Sie auf der Seite Entwicklungstools den Bereich Anwendungsentwicklung, und befolgen Sie die Anweisungen zum Herunterladen des Node.js-SDK.
- Öffnen Sie auf der Seite Entwicklungstools den Bereich Anwendungsentwicklung, und klicken Sie auf Entwicklungspackage herunterladen.
- Extrahieren Sie das Entwicklungspackage in denselben Ordner mit den Node.js-Dateien, die mit dem Beispiel heruntergeladen wurden.
- Suchen Sie in der Datei
network.yamlnach dem EintragcertificateAuthoritiesund dem zugehörigen Eintragregistrar. Das Administratorkennwort wird beim Herunterladen in der Dateinetwork.yamlmaskiert (in***konvertiert). Ersetzen Sie dieses Kennwort durch das Klartextpasswort des Administrators, wenn Sie dieses Beispiel ausführen.
- Registrieren Sie eine neue Identität bei Ihrer Oracle Blockchain Platform-Instanz:
- Erstellen Sie einen 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_Userfür Ihre Instanz zu.
- Erstellen Sie einen Benutzer in IDCS (in den folgenden Schritten als
Implementieren Sie das fein granulierte Marmorbeispiel für die Zugriffskontrolle
Gehen Sie folgendermaßen vor, um Ihren neuen Benutzer zu registrieren und die ACL-Einschränkungen mithilfe der bereitgestellten Node.js-Skripte zu implementieren.
- Neuen Benutzer registrieren:
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 in der Übersicht beschriebenen ACL-Ressourcen erstellt.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources - Erstellen Sie Ihre Testmarmorressourcen: Dadurch werden mehrere Testmarmorassets erstellt: blue1 und blue2, deren Eigentümer tom, red1 und red2 ist, deren Eigentümer Jerry ist, und green1 und green2, deren Eigentümer Spike ist.
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 Beispielszenarien durch.
- Marmor übertragen: Übertragen Sie den Marmor
blue1von Tom in Jerry. Da es keine Einschränkungen gibt, wer einen einzelnen Marmor übertragen kann, wird dies erfolgreich abgeschlossen.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry - Marmor als Administrator übertragen: Übertragen Sie Marmor
blue1von Jerry zu Spike. Da es keine Einschränkungen gibt, wer einen einzelnen Marmor übertragen kann, ist dies auch erfolgreich.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike - Historie abrufen: Fragen Sie die Historie des Marmors mit dem Namen
blue1ab. Es gibt zurück, dass es zuerst auf Jerry übertragen wurde, dann auf Spike.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1 - Alle roten Murmeln übertragen: Die
redMarblesAclACL lässt diese Übertragung zu, da die neu registrierte Identität das erforderliche"redMarblesTransferPermission=true"Fabric-Attribut aufweist, sodass die beiden roten Murmeln an tom übertragen werden.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom - Übertragen Sie alle roten Marbles als administrativer Benutzer: Die administrative Identität hat nicht das Fabric-Attribut
"redMarblesTransferPermission=true". Daher blockiert die ACLredMarblesAcldiese Übertragung.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry - Alle grünen Marbles ü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, schlägt dies fehl.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom - Marmor löschen: Die ACL
deleteMarbleAcllässt diesen Löschvorgang zu, da die neu registrierte Identität das erforderliche Fabric-Attribut"deleteMarblePermission=true"aufweist.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1 - Marmor als Benutzer mit Administratorrechten löschen: Die ACL
deleteMarbleAclverhindert diesen Löschvorgang, 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 des Beispiels verfügbar sind.
fgMarbles_chaincode.go
| Funktion | Beschreibung |
|---|---|
initMarble |
Marmor erstellen |
transferMarble |
Transfer eines Marmors von einem Besitzer zum anderen basierend auf dem Namen |
createTestMarbles |
Ruft initMarble auf, um Mustermurmeln 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 Besitzer |
delete |
Marmor löschen |
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 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 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, den angegebenen Zugriff auf die benannte Ressource hat. |