Exemple de billes de contrôle d'accès détaillé
L'application de code chaîne de billes vous permet de créer des ressources (billes) avec des attributs uniques (nom, taille, couleur et propriétaire), et d'échanger ces ressources avec d'autres participants dans un réseau de chaîne de blocs.
Cet exemple d'application comprend diverses fonctions qui vous permettent d'examiner comment utiliser des listes et des groupes de contrôle d'accès pour restreindre les fonctions à certains utilisateurs.
- Présentation de l'exemple
- Configuration et prérequis
- Implémenter l'exemple de marbre du contrôle d'accès détaillé
- Tester le contrôle d'accès
- Référence des fichiers échantillon
Présentation de l'exemple
Le scénario de test inclus dans l'exemple contient les restrictions suivantes afin de gérer les ressources :
- Le transfert en masse de billes rouges n'est autorisé que par les identités ayant l'attribut Fabric
"redMarblesTransferPermission"
. - Le transfert en masse de billes bleues n'est autorisé que par les identités ayant l'attribut Fabric
"blueMarblesTransferPermission"
. - La suppression de billes est uniquement autorisée pour les identités avec l'attribut Fabric
"deleteMarblePermission"
.
Ces restrictions sont appliquées en implémentant les méthodes de bibliothèque suivantes dans le code chaîne fgMarbles_chaincode.go
:
- Créez un groupe d'ACL de niveau fin nommé
bulkMarblesTransferGroup
. Ce groupe définira toutes les identités qui peuvent transférer des billes en fonction de la couleur (transferts en masse) :createGroup(stub, []string{" bulkMarblesTransferGroup", "List of Identities allowed to Transfer Marbles in Bulk", "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"})
- Créez une liste de contrôle d'accès de niveau fin nommée
redMarblesAcl
qui permet le transfert en masse des marbres rouges versbulkMarblesTransferGroup
:createACL(stub, []string{"redMarblesAcl", "ACL to control who can transfer red marbles in bulk", "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
- Créez une liste de contrôle d'accès de niveau fin nommée
blueMarblesAcl
qui permet le transfert en masse des billes bleues versbulkMarblesTransferGroup
:createACL(stub, []string{"blueMarblesAcl", "ACL to control who can transfer blue marbles in bulk", "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
- Créez une ACL de niveau fin nommée
deleteMarbleAcl
pour limiter la suppression de marbre en fonction de l'attribut Fabric"canDeleteMarble=true"
:createACL(stub, []string{"deleteMarbleAcl", "ACL to control who can Delete a Marble", "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"})
- Créez une ressource ACL de niveau fin nommée
marble
, sur laquelle les opérations sont contrôlées à l'aide des différentes ACL que nous avons créées :createResource(stub, []string{"marble", "System marble resource", "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})
Configuration et prérequis
Pour exécuter la version de contrôle d'accès de niveau fin de l'exemple de billes, procédez comme suit :
- Téléchargez la version de contrôle d'accès détaillée de l'exemple de billes. Dans l'onglet Outils de développement, ouvrez le panneau Exemples, puis cliquez sur le lien de téléchargement sous Billes avec des listes de contrôle d'accès de niveau fin. Extrayez ce package : il contient les fichiers ZIP de l'exemple de billes (
fgACL_MarbleSampleCC.zip
), les fichiers Node.js pour exécuter l'exemple (fgACL-NodeJSCode.zip
) et la bibliothèque de contrôle d'accès de niveau fin (Fine-GrainedAccessControlLibrary.zip
). - Hyperledger Fabric v2.x uniquement : générez le package de code chaîne qui sera déployé sur Blockchain Platform :
- Extrayez le contenu du fichier
fgACL_MarbleSampleCC.zip
dans le répertoirefgACL_MarbleSampleCC
. Le contenu du répertoirefgACL_MarbleSampleCC
sera les fichiersfgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
etgo.mod
, ainsi que le répertoireoracle.com
. - A partir de la ligne de commande, accédez au répertoire
fgACL_MarbleSampleCC
et exécutezGO111MODULE=on go mod vendor
. Cette commande télécharge les dépendances requises et les ajoute au répertoirevendor
. - Compressez tout le contenu (les quatre fichiers Go, le fichier
go.mod
et les répertoiresvendor
etoracle.com
) du répertoirefgACL_MarbleSampleCC
au format ZIP. Votre code chaîne est prêt à être déployé sur Blockchain Platform.
- Extrayez le contenu du fichier
- Hyperledger Fabric v1.4.7 uniquement : générez le package de code chaîne qui sera déployé sur Blockchain Platform :
- Installez govendor :
go get -u github.com/kardianos/govendor
- Extrayez le contenu de
fgACL_MarbleSampleCC.zip
dans le répertoirefgACL_MarbleSampleCC
. Le contenu du répertoirefgACL_MarbleSampleCC
est le suivant :fgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
et le répertoirevendor
. - A partir d'une ligne de commande, accédez au répertoire
fgACL_MarbleSampleCC
et exécutezgovendor sync
. Cette opération télécharge la dépendance requise (github.com/op/go-logging
) et l'ajoute au répertoirevendor
. - Compressez tout le contenu (les quatre fichiers Go et le répertoire
vendor
) du répertoirefgACL_MarbleSampleCC
au format ZIP. Votre code chaîne est prêt à être déployé sur Blockchain Platform.
- Installez govendor :
- Installez et déployez l'exemple de package de code chaîne mis à jour (
fgACL_MarbleSampleCC.zip
) comme décrit dans Utilisation du déploiement rapide. - Dans l'onglet Outils de développement, ouvrez le panneau Développement d'applications, puis suivez les instructions permettant de télécharger le kit SDK Node.js.
- Dans l'onglet Outils de développement, ouvrez le panneau Développement d'applications, puis cliquez sur Télécharger le package de développement.
- Extrayez le package de développement dans le même dossier avec les fichiers Node.js téléchargés avec l'exemple.
- Dans le fichier
network.yaml
, recherchez l'entréecertificateAuthorities
et son entréeregistrar
. Le mot de passe de l'administrateur est masqué (converti en***
) dansnetwork.yaml
lors du téléchargement. Il doit être remplacé par le mot de passe en clair de l'administrateur lors de l'exécution de cet exemple.
- Inscrivez une nouvelle identité auprès de votre instance Blockchain Platform :
- Créez un utilisateur dans IDCS (appelé
<NewIdentity>
dans les étapes suivantes) dans IDCS mis en correspondance avec votre location. - Attribuez à cet utilisateur le rôle d'application
CA_User
pour votre instance.
- Créez un utilisateur dans IDCS (appelé
Implémenter l'exemple de marbre du contrôle d'accès détaillé
Les étapes suivantes permettent d'inscrire votre nouvel utilisateur et d'implémenter les restrictions d'ACL à l'aide des scripts Node.js fournis.
- Inscrivez le nouvel utilisateur :
node registerEnrollUser.js <NewIdentity> <Password>
- Initialisation : initialisez les listes de contrôle d'accès.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
- Créez les listes de contrôle d'accès, les groupes et les ressources : cela crée les ressources d'ACL décrites dans la présentation.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
- Créez vos ressources de marbre de test : cette opération crée plusieurs ressources de marbre de test : blue1 et blue2 appartenant à tom, red1 et red2 appartenant à jerry, et green1 et green2 appartenant à spike.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles
Tester le contrôle d'accès
Afin de vérifier que nos listes de contrôle d'accès permettent uniquement aux utilisateurs corrects d'exécuter chaque fonction, nous passerons en revue quelques exemples de scénarios.
- Transférer un marbre : nous transférons le marbre
blue1
de tom à jerry. Comme il n'y a pas de restrictions sur qui peut transférer un seul marbre, cela devrait se terminer avec succès.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry
- Transférer une bille en tant qu'administrateur : nous transférons la bille
blue1
de jerry à spike. Comme il n'y a pas de restrictions sur qui peut transférer un seul marbre, cela devrait également se terminer avec succès.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike
- Obtenir l'historique : nous allons maintenant interroger l'historique de la bille nommée
blue1
. Il devrait revenir qu'il a été transféré d'abord à jerry puis à spike.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1
- Transférer toutes les billes rouges : la liste de contrôle d'accès
redMarblesAcl
doit autoriser ce transfert car l'identité nouvellement enregistrée possède l'attribut Fabric"redMarblesTransferPermission=true"
requis, de sorte que les deux billes rouges doivent être transférées vers tom.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom
- Transférez toutes les billes rouges en tant qu'administrateur : l'identité d'administration n'a pas l'attribut Fabric
"redMarblesTransferPermission=true"
, de sorte que l'ACLredMarblesAcl
doit bloquer ce transfert.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
- Transférer toutes les billes vertes : par défaut, seul l'accès explicitement défini est autorisé. Parce qu'il n'y a pas d'ACL qui permet le transfert en masse de billes vertes, cela devrait échouer.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
- Supprimer une marbre : la liste de contrôle d'accès
deleteMarbleAcl
autorise cette suppression car l'identité nouvellement inscrite possède l'attribut Fabric"deleteMarblePermission=true"
requis.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
- Supprimer une marbre en tant qu'administrateur : la liste de contrôle d'accès
deleteMarbleAcl
doit empêcher cette suppression car l'identité d'administration ne dispose pas de l'attribut Fabric"deleteMarblePermission=true"
requis.node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2
Référence des fichiers échantillon
Ces tableaux répertorient les méthodes disponibles dans les fichiers de code chaîne et d'application inclus dans l'exemple.
fgMarbles_chaincode.go
Fonction | Description |
---|---|
initMarble |
Créer un nouveau marbre |
transferMarble |
Transférer un marbre d'un propriétaire à un autre en fonction de son nom |
createTestMarbles |
Appelle initMarble pour créer de nouveaux exemples de billes à des fins de test
|
createFineGrainedAclSampleResources |
Crée la liste de contrôle d'accès de niveau fin (ACL), les groupes et les ressources requis par notre scénario de test |
transferMarblesBasedOnColor |
Transfère plusieurs billes d'une certaine couleur à un autre propriétaire |
delete |
Supprimer un marbre |
readMarble |
Renvoie tous les attributs d'une marbre en fonction du nom |
getHistoryForMarble |
Renvoie un historique des valeurs d'un marbre |
fgACL_Operations.go
Méthodes | Paramètres | Description |
---|---|---|
getACL |
|
Obtenez une ACL nommée ou lisez toutes les ACL. L'utilisateur qui appelle la méthode doit disposer d'un accès en lecture à l'ACL nommée. |
createACL |
|
Pour créer une ACL, l'utilisateur qui appelle la méthode doit disposer d'un accès CREATE à la ressource d'initialisation nommée ". ACLs" . Les ACL nommées en double ne sont pas autorisées
|
deleteACL |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès DELETE à l'ACL nommée. |
updateACL |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à la ressource nommée et l'ACL nommée doit exister. |
addAfterACL |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à la ressource nommée et l'ACL nommée doit exister. |
addBeforeACL |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à la ressource nommée et l'ACL nommée doit exister. |
addPatternToACL |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à la ressource nommée et l'ACL nommée doit exister. |
removePatternFromACL |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à la ressource nommée et l'ACL nommée doit exister. |
updateDescription |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à la ressource nommée et l'ACL nommée doit exister. |
removeBindACL |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à la ressource nommée et l'ACL nommée doit exister. |
addAccess |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à la ressource nommée et l'ACL nommée doit exister. |
removeAccess |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à la ressource nommée et l'ACL nommée doit exister. |
ACLInitialization |
|
Cette fonction est utilisée pour initialiser la prise en charge détaillée des ACL. |
fgGroups_Operations.go
Méthodes | Paramètres | Description |
---|---|---|
getGroup |
|
Si name= L'utilisateur qui appelle la méthode doit disposer d'un accès en lecture à ce groupe. |
createGroup |
|
Renvoie L'utilisateur qui appelle la méthode doit disposer d'un accès CREATE au groupe d'initialisation |
deleteGroup |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès DELETE à ce groupe. |
addAfterGroup |
|
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe. |
addBeforeGroup |
|
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe. |
updateDescriptionForGroup |
|
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe. |
removeBindAclFromGroup |
|
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe. |
addMembersToGroup |
|
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe. |
removeMembersFromGroup |
|
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe. |
fgResource_Operations.go
Méthodes | Paramètres | Description |
---|---|---|
createResource |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès CREATE à la ressource bootstrap nommée ". Resources" . Les ressources nommées en double ne sont pas autorisées.
|
getResource |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès en lecture à la ressource |
deleteResource |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès DELETE à la ressource nommée |
addAfterACLInResource |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à cette ressource |
addBeforeACLInResource |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à cette ressource |
updateDescriptionInResource |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à cette ressource |
removeBindACLInResource |
|
L'utilisateur qui appelle la méthode doit disposer d'un accès UPDATE à cette ressource |
checkResourceAccess |
|
Vérifie si l'utilisateur en cours qui appelle la méthode dispose de l'accès spécifié à la ressource nommée. |