Exemple de billes de contrôle d'accès finies
L'application de code de chaîne de marbres vous permet de créer des ressources (marbres) 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înes de blocs.
Cet exemple d'application comprend une variété de fonctions pour vous permettre d'examiner comment utiliser les listes de contrôle d'accès et les groupes pour restreindre les fonctions à certains utilisateurs.
- Aperçu de l'échantillon
- Conditions requises et configuration
- Implémenter l'exemple de marbre de contrôle d'accès fin
- Test du contrôle de l'accès
- Référence des exemples de fichiers
Aperçu de l'échantillon
Le scénario de test inclus dans l'échantillon contient les restrictions suivantes afin de gérer les immobilisations :
- 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 des billes n'est autorisée que pour les identités avec l'attribut Fabric
"deleteMarblePermission"
.
Ces restrictions sont appliquées en mettant en oeuvre les méthodes de bibliothèque suivantes dans le code de chaîne fgMarbles_chaincode.go
:
- Créez un groupe ACL détaillé nommé
bulkMarblesTransferGroup
. Ce groupe définira toutes les identités qui peuvent transférer des billes en fonction de la couleur (transferts en vrac) :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 billes 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 jusqu'àbulkMarblesTransferGroup
:createACL(stub, []string{"blueMarblesAcl", "ACL to control who can transfer blue marbles in bulk", "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"})
- Créez une liste de contrôle d'accès détaillée nommée
deleteMarbleAcl
pour restreindre la suppression du 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 de liste de contrôle d'accès de niveau fin nommée
marble
, dont les opérations sont contrôlées à l'aide des différentes listes de contrôle d'accès que nous avons créées :createResource(stub, []string{"marble", "System marble resource", "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})
Conditions requises et configuration
Pour exécuter la version de contrôle d'accès détaillé de l'exemple de billes, procédez comme suit :
- Téléchargez la version de contrôle d'accès détaillé de l'exemple de billes. Dans l'onglet Outils pour développeurs, ouvrez le volet Exemples, puis cliquez sur le lien de téléchargement sous Marbres avec listes de contrôle d'accès détaillées. Extraire ce paquetage - 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érer le paquetage de code de chaîne qui sera déployé sur la plate-forme de chaîne de blocs :
- 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
et le répertoireoracle.com
. - À partir de la ligne de commande, allez 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 de chaîne est prêt à être déployé sur Blockchain Platform.
- Extrayez le contenu du fichier
- Hyperledger Fabric v1.4.7 seulement : Générer l'ensemble de code de chaîne qui sera déployé sur la plate-forme de chaîne de blocs :
- Installer le fournisseur :
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 :fgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
et le répertoirevendor
. - À partir d'une ligne de commande, accédez au répertoire
fgACL_MarbleSampleCC
et exécutezgovendor sync
. Cette action 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 de chaîne est prêt à être déployé sur Blockchain Platform.
- Installer le fournisseur :
- Installez et déployez l'exemple d'ensemble de code de chaîne mis à jour (
fgACL_MarbleSampleCC.zip
), comme décrit sous Utiliser le déploiement rapide. - Dans l'onglet Outils pour développeurs, ouvrez le volet Développement d'applications, puis suivez les instructions pour télécharger la trousse SDK Node.js.
- Dans l'onglet Outils pour développeurs, ouvrez le volet Développement d'applications, puis cliquez sur Télécharger l'ensemble de développement.
- Extrayez l'ensemble 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.
- Enregistrez une nouvelle identité auprès de votre instance Blockchain Platform :
- Créez un nouvel utilisateur dans IDCS (appelé
<NewIdentity>
dans les étapes suivantes) dans IDCS mappé à votre location. - Donnez à cet utilisateur le rôle d'application
CA_User
pour votre instance.
- Créez un nouvel utilisateur dans IDCS (appelé
Implémenter l'exemple de marbre de contrôle d'accès fin
Les étapes suivantes permettent d'inscrire votre nouvel utilisateur et de mettre en oeuvre les restrictions de liste de contrôle d'accès à 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 de liste de contrôle d'accès décrites dans l'aperçu.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
- Créez vos ressources de marbre de test : Cela 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
Test du contrôle de l'accès
Afin de tester que nos listes de contrôle d'accès permettent uniquement aux bons utilisateurs d'exécuter chaque fonction, nous allons exécuter certains 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 un marbre en tant qu'utilisateur administrateur : Nous transférons le marbre
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 du marbre nommé
blue1
. Il devrait revenir qu'il a été transféré d'abord à jerry puis à pic.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 comporte 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érer toutes les billes rouges en tant qu'utilisateur administrateur : L'identité administrative n'a pas l'attribut Fabric
"redMarblesTransferPermission=true"
, la liste de contrôle d'accèsredMarblesAcl
doit donc 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 défini explicitement est autorisé. Parce qu'il n'y a pas de liste de contrôle d'accès qui permet le transfert en vrac de billes vertes, cela devrait échouer.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
- Supprimer un marbre : La liste de contrôle d'accès
deleteMarbleAcl
permet cette suppression, car l'identité nouvellement enregistrée comporte l'attribut Fabric"deleteMarblePermission=true"
requis.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1
- Supprimer une marbre en tant qu'utilisateur administrateur : La liste de contrôle d'accès
deleteMarbleAcl
doit empêcher cette suppression, car l'identité administrative n'a pas l'attribut Fabric"deleteMarblePermission=true"
requis.node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2
Référence des exemples de fichiers
Ces tableaux répertorient les méthodes disponibles dans le code de chaîne et les fichiers 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 du nom |
createTestMarbles |
Appelle initMarble pour créer de nouveaux échantillons de billes à des fins de test
|
createFineGrainedAclSampleResources |
Crée la liste de contrôle d'accès de niveau fin, 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 |
Retourne tous les attributs d'une marbre en fonction du nom |
getHistoryForMarble |
Retourne l'historique des valeurs d'un marbre |
fgACL_Operations.go
Méthodes | Paramètres | Description |
---|---|---|
getACL |
|
Obtenez une liste de contrôle d'accès nommée ou lisez toutes les listes de contrôle d'accès. L'utilisateur qui appelle la méthode doit avoir accès en lecture à la liste de contrôle d'accès nommée. |
createACL |
|
Pour créer une nouvelle liste de contrôle d'accès, l'utilisateur qui appelle la méthode doit disposer d'un accès CREATE à la ressource d'amorçage nommée ". ACLs" . Les listes de contrôle d'accès nommées en double ne sont pas autorisées
|
deleteACL |
|
L'utilisateur qui appelle la méthode doit avoir un accès DELETE à la liste de contrôle d'accès nommée. |
updateACL |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à la ressource nommée et la liste de contrôle d'accès nommée doit exister. |
addAfterACL |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à la ressource nommée et la liste de contrôle d'accès nommée doit exister. |
addBeforeACL |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à la ressource nommée et la liste de contrôle d'accès nommée doit exister. |
addPatternToACL |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à la ressource nommée et la liste de contrôle d'accès nommée doit exister. |
removePatternFromACL |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à la ressource nommée et la liste de contrôle d'accès nommée doit exister. |
updateDescription |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à la ressource nommée et la liste de contrôle d'accès nommée doit exister. |
removeBindACL |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à la ressource nommée et la liste de contrôle d'accès nommée doit exister. |
addAccess |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à la ressource nommée et la liste de contrôle d'accès nommée doit exister. |
removeAccess |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à la ressource nommée et la liste de contrôle d'accès nommée doit exister. |
ACLInitialization |
|
Cette fonction est utilisée pour initialiser la prise en charge de la liste de contrôle d'accès détaillée. |
fgGroups_Operations.go
Méthodes | Paramètres | Description |
---|---|---|
getGroup |
|
Si name= L'utilisateur qui appelle la méthode doit avoir accès en lecture à ce groupe. |
createGroup |
|
Retourne L'utilisateur qui appelle la méthode doit avoir l'accès CREATE au groupe d'amorçage |
deleteGroup |
|
L'utilisateur qui appelle la méthode doit avoir un accès DELETE à ce groupe. |
addAfterGroup |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à ce groupe. |
addBeforeGroup |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à ce groupe. |
updateDescriptionForGroup |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à ce groupe. |
removeBindAclFromGroup |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à ce groupe. |
addMembersToGroup |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à ce groupe. |
removeMembersFromGroup |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à ce groupe. |
fgResource_Operations.go
Méthodes | Paramètres | Description |
---|---|---|
createResource |
|
L'utilisateur qui appelle la méthode doit avoir un accès CREATE à la ressource d'amorçage nommée ". Resources" . Les ressources nommées en double ne sont pas autorisées.
|
getResource |
|
L'utilisateur qui appelle la méthode doit avoir accès en lecture à la ressource |
deleteResource |
|
L'utilisateur qui appelle la méthode doit avoir un accès DELETE à la ressource nommée |
addAfterACLInResource |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à cette ressource |
addBeforeACLInResource |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à cette ressource |
updateDescriptionInResource |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à cette ressource |
removeBindACLInResource |
|
L'utilisateur qui appelle la méthode doit avoir un accès UPDATE à cette ressource |
checkResourceAccess |
|
Vérifie si l'utilisateur courant qui appelle la méthode dispose de l'accès spécifié à la ressource nommée. |