Ejemplo de mármoles de control de acceso detallado
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 comercializar estos activos con otros participantes en una red blockchain.
Esta aplicación de ejemplo incluye una serie 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 de la Muestra
- Requisitos 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 ejemplo
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 canicas rojas solo está permitida por identidades que tienen el atributo Fabric
"redMarblesTransferPermission". - La transferencia masiva de canicas azules solo está permitida por 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 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 la transferencia masiva de acceso a 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 a 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 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 controlen 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 canicas, realice estos pasos:
- Descargue la versión de control de acceso detallado de la muestra de mármoles. En el separador Herramientas de desarrollador, abra el panel Muestras y, a continuación, haga clic en el enlace de descarga en Marcos con ACL Detalladas. Extraiga este paquete, que contiene archivos ZIP de los archivos de ejemplo de canicas (
fgACL_MarbleSampleCC.zip), 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 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. - Comprima todo el contenido (los cuatro archivos Go, el archivo
go.mody los directoriosvendoryoracle.com) del directoriofgACL_MarbleSampleCCen formato ZIP. El código de cadenas está listo para desplegarse en 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 Uso de despliegue rápido. - En el separador Herramientas de desarrollador, abra el panel Desarrollo de aplicaciones y, a continuación, siga las instrucciones para descargar el SDK de Node.js.
- En el separador Herramientas de desarrollador, 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 se enmascara (se convierte en***) ennetwork.yamlcuando se descarga. Se debe sustituir por la contraseña de texto no cifrado del administrador al ejecutar este ejemplo.
- Registre una nueva identidad con su instancia de Blockchain Platform:
- Cree un nuevo 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 nuevo 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 implantar las restricciones de ACL mediante los scripts Node.js proporcionados.
- Inscriba 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: crea los recursos de ACL descritos en la visión general.
node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> createFineGrainedAclSampleResources - Cree los recursos de mármol de prueba: 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 debe completarse con éxito.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 jerry - Transferir un mármol como usuario administrativo: transfiera el mármol
blue1de jerry a spike. Debido a que no hay restricciones sobre quién puede transferir un solo mármol, esto también debe completarse con éxito.node invokeQueryCC.js <AdminIdentity> <Password> <ChannelName> <ChaincodeName> transferMarble blue1 spike - Obtener historial: consulte el historial del mármol denominado
blue1. Debería devolver 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
redMarblesAcldebe permitir esta transferencia porque la identidad recién registrada tiene el atributo Fabric"redMarblesTransferPermission=true"necesario, por lo que los dos mármoles rojos se deben transferir 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 ACLredMarblesAcldebe bloquear 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 debería fallar.
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"necesario.node invokeQueryCC.js <NewIdentity> <Password> <ChannelName> <ChaincodeName> delete green1 - Suprimir un mármol como usuario administrativo: la ACL
deleteMarbleAcldebe evitar 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 en el ejemplo.
fgMarbles_chaincode.go
| Función | Descripción |
|---|---|
initMarble |
Crear un nuevo mármol |
transferMarble |
Transferir un mármol de un propietario a otro basado en el nombre |
createTestMarbles |
Llama a initMarble para crear nuevos 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 canicas 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 nueva 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 debe existir la ACL con nombre. |
addAfterACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre. |
addBeforeACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre. |
addPatternToACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre. |
removePatternFromACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre. |
updateDescription |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre. |
removeBindACL |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre. |
addAccess |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre. |
removeAccess |
|
El usuario que llama al método debe tener acceso UPDATE al recurso con nombre y debe existir la ACL con nombre. |
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 para el grupo de inicialización |
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. |