Échantillon de billes de contrôle d'accès fin
L'application de code de chaîne de billes vous permet de créer des ressources (billes) avec des attributs uniques (nom, taille, couleur et responsable) et d'échanger ces ressources avec d'autres participants à un réseau de chaîne de blocs.
Cet exemple d'application comprend une variété de fonctions pour vous permettre d'examiner comment utiliser des listes de contrôle d'accès et des groupes pour restreindre les fonctions à certains utilisateurs.
- Aperçu de l'exemple
- Prérequis et configuration
- Implémenter l'exemple de marbre de contrôle d'accès de niveau fin
- Tester le contrôle d'accès
- Informations sur les exemples de fichiers
Aperçu de l'exemple
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 de 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 de listes de contrôle d'accès 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 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 détaillée nommée
redMarblesAclqui fournit un transfert en masse de billes rouges pour l'accès àbulkMarblesTransferGroup: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 détaillée nommée
blueMarblesAclqui fournit un transfert en masse de billes bleues pour l'accès à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
deleteMarbleAclpour 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 détaillée nommée
marble, opérations 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"})
Prérequis et configuration
Pour exécuter la version de contrôle d'accès détaillé de l'échantillon de billes, procédez comme suit :
- Téléchargez la version de contrôle d'accès fine de l'échantillon de billes. Dans la page Outils pour développeurs, ouvrez le volet Exemples, puis cliquez sur le lien de téléchargement sous Marques avec des listes de contrôle d'accès détaillées. Extraire cet ensemble, qui contient les fichiers
.zipde l'échantillon 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 détaillé (Fine-GrainedAccessControlLibrary.zip). - Générer le paquet de code de chaîne qui sera déployé sur Oracle Blockchain Platform :
- Extrayez le contenu du fichier
fgACL_MarbleSampleCC.zipdans le répertoirefgACL_MarbleSampleCC. Le contenu du répertoirefgACL_MarbleSampleCCsera les fichiersfgACL_Operations.go,fgGroups_Operations.go,fgMarbles_chaincode.go,fgResource_Operations.goetgo.modet le répertoireoracle.com. - À partir de la ligne de commande, allez au répertoire
fgACL_MarbleSampleCCet 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.modet les répertoiresvendoretoracle.com) du répertoirefgACL_MarbleSampleCCau format ZIP. Le code de chaîne est prêt à être déployé sur Oracle Blockchain Platform.
- Extrayez le contenu du fichier
- Installer et déployer l'exemple d'ensemble de code de chaîne mis à jour (
fgACL_MarbleSampleCC.zip), comme décrit sous Utiliser le déploiement rapide. - Dans la page 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 la page 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éecertificateAuthoritieset son entréeregistrar. Le mot de passe de l'administrateur est masqué (converti en***) dansnetwork.yamllors du téléchargement. Remplacez ce mot de passe par le mot de passe en texte clair de l'administrateur lors de l'exécution de cet exemple.
- Enregistrer une nouvelle identité avec votre instance Oracle Blockchain Platform :
- Créez un utilisateur dans IDCS (appelé
<NewIdentity>dans les étapes suivantes) dans l'IDCS mappé à votre location. - Attribuez à cet utilisateur le rôle d'application
CA_Userpour votre instance.
- Créez un utilisateur dans IDCS (appelé
Implémenter l'exemple de marbre de contrôle d'accès de niveau fin
Effectuez les étapes suivantes pour inscrire votre nouvel utilisateur et mettre en oeuvre les restrictions de liste de contrôle d'accès à l'aide des scripts Node.js fournis.
- Inscrire 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éer 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éer 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
Tester le contrôle d'accès
Pour vérifier que nos listes de contrôle d'accès permettent uniquement aux utilisateurs appropriés d'exécuter chaque fonction, exécutez certains exemples de scénarios.
- Transférer un marbre : Transférer le marbre
blue1de tom à jerry. Parce qu'il n'y a aucune restriction sur qui peut transférer un seul marbre, cela se termine avec succès.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry - Transférer un marbre en tant qu'utilisateur administratif : Transférer le marbre
blue1de jerry à spike. Parce qu'il n'y a aucune restriction sur qui peut transférer un seul marbre, cela se termine également avec succès.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike - Obtenir l'historique : Interrogez l'historique du marbre nommé
blue1. Il revient 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
redMarblesAclautorise ce transfert, car la nouvelle identité enregistrée a l'attribut Fabric"redMarblesTransferPermission=true"requis, de sorte que les deux billes rouges seront transférées à tom.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom - Transférer toutes les marbres rouges en tant qu'utilisateur administrateur : L'identité d'administration n'a pas l'attribut Fabric
"redMarblesTransferPermission=true". La liste de contrôle d'accèsredMarblesAclbloque donc 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é. Comme il n'y a pas de liste de contrôle d'accès qui permet le transfert en masse de billes vertes, cela échoue.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom - Supprimer un marbre : La liste de contrôle d'accès
deleteMarbleAclautorise cette suppression, car la nouvelle identité enregistrée comporte l'attribut Fabric"deleteMarblePermission=true"requis.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1 - Supprimer un marbre en tant qu'utilisateur administrateur : La liste de contrôle d'accès
deleteMarbleAclempêche cette suppression, car l'identité administrative n'a pas l'attribut"deleteMarblePermission=true"Fabric requis.node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2
Informations sur les 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 marbre |
transferMarble |
Transférer un marbre d'un propriétaire à un autre en fonction du nom |
createTestMarbles |
Appelle initMarble pour créer des exemples de billes à des fins de test
|
createFineGrainedAclSampleResources |
Crée la liste de contrôle d'accès détaillée (LCA), 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'un 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 liste de contrôle d'accès, l'utilisateur appelant la méthode doit avoir l'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 appelant 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 appelant 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 appelant 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 appelant 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 appelant 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 appelant 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 appelant 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 appelant 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 appelant 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 des listes de contrôle d'accès détaillées. |
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 appelant 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 appelant la méthode doit avoir un accès UPDATE à ce groupe. |
addBeforeGroup |
|
L'utilisateur appelant la méthode doit avoir un accès UPDATE à ce groupe. |
updateDescriptionForGroup |
|
L'utilisateur appelant la méthode doit avoir un accès UPDATE à ce groupe. |
removeBindAclFromGroup |
|
L'utilisateur appelant la méthode doit avoir un accès UPDATE à ce groupe. |
addMembersToGroup |
|
L'utilisateur appelant la méthode doit avoir un accès UPDATE à ce groupe. |
removeMembersFromGroup |
|
L'utilisateur appelant la méthode doit avoir un accès UPDATE à ce groupe. |
fgResource_Operations.go
| Méthodes | Paramètres | Description |
|---|---|---|
createResource |
|
L'utilisateur appelant la méthode doit avoir l'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 appelant la méthode doit avoir accès en lecture à la ressource |
deleteResource |
|
L'utilisateur appelant la méthode doit avoir un accès DELETE à la ressource nommée |
addAfterACLInResource |
|
L'utilisateur appelant la méthode doit avoir un accès UPDATE à cette ressource |
addBeforeACLInResource |
|
L'utilisateur appelant la méthode doit avoir un accès UPDATE à cette ressource |
updateDescriptionInResource |
|
L'utilisateur appelant la méthode doit avoir un accès UPDATE à cette ressource |
removeBindACLInResource |
|
L'utilisateur appelant la méthode doit avoir un accès UPDATE à cette ressource |
checkResourceAccess |
|
Vérifie si l'utilisateur courant appelant la méthode dispose de l'accès spécifié à la ressource nommée. |