Ejemplo de mármoles de control de acceso específico
La aplicación de código de cadenas de mármoles permite crear activos (mármoles) con atributos únicos (nombre, tamaño, color y propietario) y intercambiar estos activos con otros participantes en una red de cadenas de bloques.
Esta aplicación de ejemplo incluye una variedad de funciones que le permiten examinar cómo trabajar con listas y grupos de control de acceso para restringir las funciones a determinados usuarios.
- Visión General de la Muestra
- Requisitos previos y configuración
- Implementación de la muestra de mármol de control de acceso detallado
- Prueba del control de acceso
- Referencia de archivos de muestra
Visión General de la Muestra
El escenario de prueba incluido en el ejemplo contiene las siguientes restricciones para gestionar activos:
- La transferencia masiva de mármoles rojos solo está permitida por las identidades que tienen el atributo Fabric
"redMarblesTransferPermission". - La transferencia masiva de mármoles azules solo está permitida por las identidades que tienen el atributo Fabric
"blueMarblesTransferPermission". - La supresión de mármoles solo se permite para identidades con el atributo Fabric
"deleteMarblePermission".
Estas restricciones se aplican mediante la implementación de los siguientes métodos de biblioteca en el código de cadena fgMarbles_chaincode.go:
- Cree un grupo de ACL detallado denominado
bulkMarblesTransferGroup. Este grupo definirá todas las identidades que pueden transferir mármoles en función del color (transferencias masivas):createGroup(stub, []string{" bulkMarblesTransferGroup", "List of Identities allowed to Transfer Marbles in Bulk", "%ATTR%redMarblesTransferPermission=true, %ATTR%blueMarblesTransferPermission=true", ".ACLs"}) - Cree una ACL detallada denominada
redMarblesAclque proporcione la transferencia masiva de acceso de mármoles rojos abulkMarblesTransferGroup:createACL(stub, []string{"redMarblesAcl", "ACL to control who can transfer red marbles in bulk", "redMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"}) - Cree una ACL detallada denominada
blueMarblesAclque proporcione la transferencia masiva de acceso de mármoles azules abulkMarblesTransferGroup:createACL(stub, []string{"blueMarblesAcl", "ACL to control who can transfer blue marbles in bulk", "blueMarblesTransferPermission", "%GRP%bulkMarblesTransferGroup", "true", ".ACLs"}) - Cree una ACL detallada denominada
deleteMarbleAclpara restringir la supresión de mármol basada en el atributo Fabric"canDeleteMarble=true":createACL(stub, []string{"deleteMarbleAcl", "ACL to control who can Delete a Marble", "deleteMarblePermission", "%ATTR%deleteMarblePermission=true", "true", ".ACLs"}) - Cree un recurso de ACL detallado denominado
marble, operaciones en las que se controlan mediante las distintas ACL que hemos creado:createResource(stub, []string{"marble", "System marble resource", "deleteMarbleAcl,blueMarblesAcl,redMarblesAcl,.ACLs"})
Requisitos previos y configuración
Para ejecutar la versión de control de acceso detallado del ejemplo de mármoles, complete estos pasos:
- Descargue la versión de control de acceso detallado de la muestra de mármoles. En la página Herramientas para desarrolladores, abra el panel Muestras y, a continuación, haga clic en el enlace de descarga en Mármoles con ACL detalladas. Extraiga este paquete, que contiene archivos
.zipdel ejemplo de mármoles (fgACL_MarbleSampleCC.zip), archivos Node.js para ejecutar el ejemplo (fgACL-NodeJSCode.zip) y la biblioteca de control de acceso detallado (Fine-GrainedAccessControlLibrary.zip). - Genere el paquete de código de cadena que se desplegará en Oracle Blockchain Platform:
- Extraiga el contenido del archivo
fgACL_MarbleSampleCC.zipen el directoriofgACL_MarbleSampleCC. El contenido del directoriofgACL_MarbleSampleCCserá los archivosfgACL_Operations.go,fgGroups_Operations.go,fgMarbles_chaincode.go,fgResource_Operations.goygo.mody el directoriooracle.com. - Desde la línea de comandos, vaya al directorio
fgACL_MarbleSampleCCy ejecuteGO111MODULE=on go mod vendor. Este comando descarga las dependencias necesarias y las agrega al directoriovendor. - Comprimir todo el contenido (los cuatro archivos Go, el archivo
go.mody los directoriosvendoryoracle.com) del directoriofgACL_MarbleSampleCCen formato ZIP. Su código de cadena está listo para su despliegue en Oracle Blockchain Platform.
- Extraiga el contenido del archivo
- Instale y despliegue el paquete de código de cadenas de ejemplo actualizado (
fgACL_MarbleSampleCC.zip), como se describe en Usar despliegue rápido. - En la página Herramientas de desarrollador, abra el panel Desarrollo de aplicaciones y, a continuación, siga las instrucciones para descargar el SDK Node.js.
- En la página Herramientas para desarrolladores, abra el panel Desarrollo de aplicaciones y, a continuación, haga clic en Descargar el paquete de desarrollo.
- Extraiga el paquete de desarrollo en la misma carpeta con los archivos Node.js descargados con el ejemplo.
- En el archivo
network.yaml, busque la entradacertificateAuthoritiesy su entradaregistrar. La contraseña del administrador está enmascarada (convertida en***) ennetwork.yamlcuando se descarga. Sustituya esta contraseña por la contraseña de texto no cifrado del administrador al ejecutar este ejemplo.
- Registre una nueva identidad con su instancia de Oracle Blockchain Platform:
- Cree un usuario en IDCS (denominado
<NewIdentity>en los siguientes pasos) en el IDCS asignado a su arrendamiento. - Proporcione a este usuario el rol de aplicación
CA_Userpara su instancia.
- Cree un usuario en IDCS (denominado
Implementación de la muestra de mármol de control de acceso detallado
Complete los siguientes pasos para inscribir al nuevo usuario e implementar las restricciones de ACL mediante los scripts Node.js proporcionados.
- Inscribir al nuevo usuario:
node registerEnrollUser.js <NewIdentity> <Password> - Inicialización: inicialice las listas de control de acceso.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> ACLInitialization - Cree las listas, los grupos y los recursos de control de acceso: esto crea los recursos de ACL que se describen en la visión general.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources - Cree sus recursos de mármol de prueba: esto crea varios activos de mármol de prueba: blue1 y blue2, propiedad de tom, red1 y red2, propiedad de jerry, y green1 y green2, propiedad de spike.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createTestMarbles
Prueba del control de acceso
Para probar que nuestras listas de control de acceso permiten que solo los usuarios correctos realicen cada función, ejecute algunos escenarios de ejemplo.
- Transferir un mármol: transfiera el mármol
blue1de tom a jerry. Debido a que no hay restricciones sobre quién puede transferir un solo mármol, esto finaliza correctamente.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry - Transferir un mármol como usuario administrativo: transfiera el mármol
blue1de jerry a pico. Debido a que no hay restricciones sobre quién puede transferir un solo mármol, esto también se completa correctamente.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike - Obtener historial: consulte el historial del mármol denominado
blue1. Devuelve que fue transferido primero a jerry y luego a pico.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> getHistoryForMarble blue1 - Transferir todos los mármoles rojos: la ACL
redMarblesAclpermite esta transferencia porque la identidad recién registrada tiene el atributo de Fabric"redMarblesTransferPermission=true"requerido, por lo que los dos mármoles rojos se transferirán a tom.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red tom - Transferir todos los mármoles rojos como usuario administrativo: la identidad administrativa no tiene el atributo Fabric
"redMarblesTransferPermission=true", por lo que la ACLredMarblesAclbloquea esta transferencia.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor red jerry - Transferir todos los mármoles verdes: por defecto, solo se permite el acceso definido explícitamente. Debido a que no hay una ACL que permita la transferencia masiva de mármoles verdes, esto falla.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarblesBasedOnColor green tom - Suprimir un mármol: la ACL
deleteMarbleAclpermite esta supresión porque la identidad recién registrada tiene el atributo Fabric"deleteMarblePermission=true"requerido.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1 - Suprimir un mármol como usuario administrativo: la ACL
deleteMarbleAclimpide esta supresión porque la identidad administrativa no tiene el atributo Fabric"deleteMarblePermission=true"necesario.node invokeQueryCC.js < AdminIdentity > <Password> <ChannelName> <ChaincodeName> delete green2
Referencia de archivos de muestra
En estas tablas se muestran los métodos disponibles en el código de cadena y los archivos de aplicación incluidos en el ejemplo.
fgMarbles_chaincode.go
| Función | Descripción |
|---|---|
initMarble |
Crear un mármol |
transferMarble |
Transferir un mármol de un propietario a otro según el nombre |
createTestMarbles |
Llama a initMarble para crear mármoles de muestra con fines de prueba
|
createFineGrainedAclSampleResources |
Crea la lista de control de acceso detallado (ACL), los grupos y los recursos que necesita nuestro escenario de prueba |
transferMarblesBasedOnColor |
Transfiere múltiples mármoles de un determinado color a otro propietario |
delete |
Eliminar un mármol |
readMarble |
Devuelve todos los atributos de un mármol según el nombre |
getHistoryForMarble |
Devuelve un historial de valores para un mármol |
fgACL_Operations.go
| Métodos | Parámetros | Descripción |
|---|---|---|
getACL |
|
Obtenga una ACL con nombre o lea todas las ACL. El usuario que llama al método debe tener acceso READ a la ACL con nombre. |
createACL |
|
Para crear una ACL, el usuario que llama al método debe tener acceso CREATE al recurso de inicialización de datos denominado ". ACLs". No se permiten ACL con nombre duplicadas
|
deleteACL |
|
El usuario que llama al método debe tener acceso DELETE a la ACL con nombre. |
updateACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y la ACL con nombre debe existir. |
addAfterACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y la ACL con nombre debe existir. |
addBeforeACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y la ACL con nombre debe existir. |
addPatternToACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y la ACL con nombre debe existir. |
removePatternFromACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y la ACL con nombre debe existir. |
updateDescription |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y la ACL con nombre debe existir. |
removeBindACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y la ACL con nombre debe existir. |
addAccess |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y la ACL con nombre debe existir. |
removeAccess |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y la ACL con nombre debe existir. |
ACLInitialization |
|
Esta función se utiliza para inicializar la compatibilidad con ACL detallada. |
fgGroups_Operations.go
| Métodos | Parámetros | Descripción |
|---|---|---|
getGroup |
|
Si name= El usuario que llama al método debe tener acceso READ a este grupo. |
createGroup |
|
Devuelve El usuario que llama al método debe tener acceso CREATE al grupo de inicialización de datos |
deleteGroup |
|
El usuario que llama al método debe tener acceso DELETE a este grupo. |
addAfterGroup |
|
El usuario que llama al método debe tener acceso UPDATE a este grupo. |
addBeforeGroup |
|
El usuario que llama al método debe tener acceso UPDATE a este grupo. |
updateDescriptionForGroup |
|
El usuario que llama al método debe tener acceso UPDATE a este grupo. |
removeBindAclFromGroup |
|
El usuario que llama al método debe tener acceso UPDATE a este grupo. |
addMembersToGroup |
|
El usuario que llama al método debe tener acceso UPDATE a este grupo. |
removeMembersFromGroup |
|
El usuario que llama al método debe tener acceso UPDATE a este grupo. |
fgResource_Operations.go
| Métodos | Parámetros | Descripción |
|---|---|---|
createResource |
|
El usuario que llama al método debe tener acceso CREATE al recurso de inicialización de datos denominado ". Resources". No se permiten recursos con nombre duplicados.
|
getResource |
|
El usuario que llama al método debe tener acceso READ al recurso |
deleteResource |
|
El usuario que llama al método debe tener acceso DELETE al recurso con nombre |
addAfterACLInResource |
|
El usuario que llama al método debe tener acceso UPDATE a este recurso |
addBeforeACLInResource |
|
El usuario que llama al método debe tener acceso UPDATE a este recurso |
updateDescriptionInResource |
|
El usuario que llama al método debe tener acceso UPDATE a este recurso |
removeBindACLInResource |
|
El usuario que llama al método debe tener acceso UPDATE a este recurso |
checkResourceAccess |
|
Comprueba si el usuario actual que llama al método tiene el acceso especificado al recurso con nombre. |