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 d'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

Le scénario de test inclus dans l'échantillon contient les restrictions suivantes pour gérer les immobilisations :

  • Le transfert en masse de billes rouges n'est autorisé que par les identités ayant l'attribut "redMarblesTransferPermission" Fabric.
  • Le transfert en masse de billes bleues n'est autorisé que par les identités ayant l'attribut "blueMarblesTransferPermission" Fabric.
  • La suppression des billes est autorisée uniquement aux identités avec l'attribut "deleteMarblePermission" Fabric.

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 de listes de contrôle d'accès 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 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 fournit un transfert en masse des billes rouges vers 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 de niveau fin nommée blueMarblesAcl qui fournit un transfert en masse des billes bleues vers 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 de niveau fin 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, sur laquelle 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"})

Prérequis et configuration

Pour exécuter la version de contrôle d'accès de niveau fin de l'échantillon de billes, procédez comme suit :

  1. Téléchargez la version de contrôle d'accès détaillé de l'échantillon de billes. Dans l'onglet Outils de développement, ouvrez le panneau Exemples, puis cliquez sur le lien de téléchargement sous Marbres avec listes de contrôle d'accès détaillées. Extrayez ce package, qui 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).
  2. Générez le package de code chaîne qui sera déployé sur Blockchain Platform :
    • Extrayez le contenu du fichier fgACL_MarbleSampleCC.zip vers le répertoire fgACL_MarbleSampleCC. Le contenu du répertoire fgACL_MarbleSampleCC sera les fichiers fgACL_Operations.go, fgGroups_Operations.go, fgMarbles_chaincode.go, fgResource_Operations.go et go.mod, ainsi que le répertoire oracle.com.
    • A partir de la ligne de commande, accédez au répertoire fgACL_MarbleSampleCC et exécutez GO111MODULE=on go mod vendor. Cette commande télécharge les dépendances requises et les ajoute au répertoire vendor.
    • Compressez tout le contenu (les quatre fichiers Go, le fichier go.mod et les répertoires vendor et oracle.com) du répertoire fgACL_MarbleSampleCC au format ZIP. Votre code chaîne est prêt à être déployé sur Blockchain Platform.
  3. 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.
  4. Dans l'onglet Outils de développement, ouvrez le panneau Développement d'applications, puis suivez les instructions pour télécharger le kit SDK Node.js.
  5. 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.
    1. Extrayez le package de développement dans le même dossier avec les fichiers Node.js téléchargés avec l'exemple.
    2. Dans le fichier network.yaml, recherchez l'entrée certificateAuthorities et son entrée registrar. Le mot de passe de l'administrateur est masqué (converti en ***) dans network.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.
  6. Inscrivez une nouvelle identité auprès de votre instance Blockchain Platform :
    1. Créez un utilisateur dans IDCS (appelé <NewIdentity> dans les étapes suivantes) dans IDCS mis en correspondance avec votre location.
    2. Attribuez à cet utilisateur le rôle d'application CA_User pour votre instance.

Implémenter l'exemple de marbre de contrôle d'accès détaillé

Pour inscrire votre nouvel utilisateur et implémenter les restrictions d'ACL à l'aide des scripts Node.js fournis, procédez comme suit.

  1. Inscrire le nouvel utilisateur :
    node registerEnrollUser.js <NewIdentity> <Password>
  2. Initialisation : initialisez les listes de contrôle d'accès.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization
  3. Créer les listes de contrôle d'accès, les groupes et les ressources : permet de créer les ressources de liste de contrôle d'accès décrites dans la présentation.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources
  4. 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

Tester le contrôle d'accès

Pour vérifier que nos listes de contrôle d'accès autorisent uniquement les utilisateurs appropriés à exécuter chaque fonction, exécutez des exemples de scénario.

  1. Transférer un marbre : Transférer le marbre blue1 de tom vers jerry. Parce qu'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
  2. Transférer un marbre en tant qu'administrateur : transférez le marbre blue1 de jerry à spike. Parce qu'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
  3. Obtenir l'historique : interrogez 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
  4. Transférer toutes les billes rouges : l'ACL redMarblesAcl doit autoriser ce transfert car l'identité nouvellement inscrite 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
  5. Transférer toutes les billes rouges en tant qu'administrateur : l'identité administrative n'ayant pas l'attribut Fabric "redMarblesTransferPermission=true", l'ACL redMarblesAcl doit bloquer ce transfert.
    node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry
  6. 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 d'ACL qui permet le transfert en masse de billes vertes, cela devrait échouer.
    node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom
  7. Supprimer un marbre : l'ACL 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
  8. Supprimer un marbre en tant qu'utilisateur administratif : l'ACL deleteMarbleAcl doit empêcher cette suppression car l'identité administrative ne dispose pas de 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 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 du 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, 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'un marbre en fonction du nom
getHistoryForMarble Renvoie un historique des valeurs d'un marbre

fgACL_Operations.go

Méthodes Paramètres Description
getACL
  • name
Obtenez une ACL nommée ou lisez toutes les ACL. L'utilisateur qui appelle la méthode doit avoir un accès en lecture à l'ACL nommée.
createACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
  • Identity_Certificate
Pour créer une liste de contrôle d'accès, l'utilisateur qui appelle la méthode doit disposer d'un accès CREATE à la ressource de démarrage nommée ". ACLs". Les listes de contrôle d'accès nommées en double ne sont pas autorisées
deleteACL
  • name
L'utilisateur qui appelle la méthode doit disposer de l'accès DELETE à l'ACL nommée.
updateACL
  • name
  • description
  • accesses
  • patterns
  • allowed
  • BindACLs
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à la ressource nommée et l'ACL nommée doit exister.
addAfterACL
  • aclName
  • existingBindAclName
  • newBindAclName
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à la ressource nommée et l'ACL nommée doit exister.
addBeforeACL
  • aclName
  • existingBindAclName
  • newBindAclName
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à la ressource nommée et l'ACL nommée doit exister.
addPatternToACL
  • aclName
  • BindPattern
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à la ressource nommée et l'ACL nommée doit exister.
removePatternFromACL
  • aclName
  • BindPattern
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à la ressource nommée et l'ACL nommée doit exister.
updateDescription
  • aclName
  • newDesc
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à la ressource nommée et l'ACL nommée doit exister.
removeBindACL
  • aclName
  • bindAclNameToRemove
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à la ressource nommée et l'ACL nommée doit exister.
addAccess
  • aclName
  • accessName
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à la ressource nommée et l'ACL nommée doit exister.
removeAccess
  • aclName
  • accessName
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à la ressource nommée et l'ACL nommée doit exister.
ACLInitialization
  • Aucun élément
Cette fonction est utilisée pour initialiser la prise en charge des ACL de niveau fin.

fgGroups_Operations.go

Méthodes Paramètres Description
getGroup
  • name

Si name="GetAll", il renvoie tous les groupes auxquels l'identité a accès. Sinon, il renvoie les détails du groupe individuel (s'ils sont accessibles) en fonction du nom.

L'utilisateur qui appelle la méthode doit avoir un accès en lecture à ce groupe.

createGroup
  • name
  • description
  • patterns
  • bindACLs

Renvoie success ou error.

L'utilisateur qui appelle la méthode doit disposer d'un accès CREATE au groupe de démarrage ". Group"

deleteGroup
  • name
L'utilisateur qui appelle la méthode doit avoir un accès DELETE à ce groupe.
addAfterGroup
  • groupName
  • existingBindAclName
  • newBindAclName
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe.
addBeforeGroup
  • groupName
  • existingBindAclName
  • newBindAclName
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe.
updateDescriptionForGroup
  • groupName
  • newDesc
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe.
removeBindAclFromGroup
  • groupName
  • bindAclNameToRemove
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe.
addMembersToGroup
  • groupName
  • pattern
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à ce groupe.
removeMembersFromGroup
  • groupName
  • pattern
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
  • name
  • description
  • bindACLs
L'utilisateur qui appelle la méthode doit disposer d'un accès CREATE à la ressource de démarrage nommée ". Resources". Les ressources nommées en double ne sont pas autorisées.
getResource
  • name
L'utilisateur qui appelle la méthode doit avoir un accès en lecture à la ressource
deleteResource
  • name
L'utilisateur qui appelle la méthode doit disposer de l'accès DELETE à la ressource nommée.
addAfterACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à cette ressource
addBeforeACLInResource
  • ResourceName
  • existingBindAclName
  • newBindAclName
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à cette ressource
updateDescriptionInResource
  • ResourceName
  • newDesc
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à cette ressource
removeBindACLInResource
  • ResourceName
  • bindAclNameToRemove
L'utilisateur qui appelle la méthode doit disposer de l'accès UPDATE à cette ressource
checkResourceAccess
  • ResourceName
  • access
Vérifie si l'utilisateur en cours qui appelle la méthode dispose de l'accès spécifié à la ressource nommée.