Ejemplo de canicas de control de acceso fino
La aplicación de código de cadenas de mármoles le 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 funciones a determinados usuarios.
- Visión General del Ejemplo
- Requisitos y configuración
- Implantación del Ejemplo de Mármol de Control de Acceso Detallado
- Prueba del Control de Acceso
- Referencia de archivos de ejemplo
Visión General del Ejemplo
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 identidades que tienen el atributo Fabric
"blueMarblesTransferPermission". - La supresión de mármoles solo se permite a las 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 cadenas 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 una transferencia masiva de mármoles rojos de acceso 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 una transferencia masiva de mármoles azules de acceso 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 según 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 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.mod, así como 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 Use Quick Deployment. - 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 la instancia.
- Cree un usuario en IDCS (denominado
Implantación del Ejemplo de Mármol de Control de Acceso Detallado
Complete los siguientes pasos para inscribir al nuevo usuario e implantar 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 descritos 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 de Fabric"deleteMarblePermission=true"necesario.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 ejemplo
En estas tablas se muestran los métodos disponibles en los archivos de aplicación y código de cadenas incluidos con el ejemplo.
fgMarbles_chaincode.go
| Función | Descripción |
|---|---|
initMarble |
Crear un mármol |
transferMarble |
Transferir un mármol de un propietario a otro basado en 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 necesarios para nuestro escenario de prueba |
transferMarblesBasedOnColor |
Transfiere varios 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. |