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
redMarblesAcl
que 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
blueMarblesAcl
que 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
deleteMarbleAcl
para 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 de la muestra 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: contiene archivos ZIP del ejemplo de canicas (
fgACL_MarbleSampleCC.zip
), archivos Node.js para ejecutar el ejemplo (fgACL-NodeJSCode.zip
) y la biblioteca de control de acceso detallado (Fine-GrainedAccessControlLibrary.zip
). - Solo Hyperledger Fabric v2.x: genere el paquete de código de cadena que se desplegará en Blockchain Platform:
- Extraiga el contenido del archivo
fgACL_MarbleSampleCC.zip
en el directoriofgACL_MarbleSampleCC
. El contenido del directoriofgACL_MarbleSampleCC
será los archivosfgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
ygo.mod
y el directoriooracle.com
. - Desde la línea de comandos, vaya al directorio
fgACL_MarbleSampleCC
y 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.mod
y los directoriosvendor
yoracle.com
) del directoriofgACL_MarbleSampleCC
en formato ZIP. El código de cadenas está listo para desplegarse en Blockchain Platform.
- Extraiga el contenido del archivo
- Solo Hyperledger Fabric v1.4.7: genere el paquete de código de cadena que se desplegará en Blockchain Platform:
- Instalar Govendor:
go get -u github.com/kardianos/govendor
- Extraiga el contenido de
fgACL_MarbleSampleCC.zip
en el directoriofgACL_MarbleSampleCC
. El contenido del directoriofgACL_MarbleSampleCC
sería:fgACL_Operations.go
,fgGroups_Operations.go
,fgMarbles_chaincode.go
,fgResource_Operations.go
y el directoriovendor
. - Desde una línea de comandos, vaya al directorio
fgACL_MarbleSampleCC
y ejecutegovendor sync
. De esta forma, se descargará la dependencia necesaria (github.com/op/go-logging
) y se agregará al directoriovendor
. - Comprima todo el contenido (los cuatro archivos Go y el directorio
vendor
) del directoriofgACL_MarbleSampleCC
en formato ZIP. El código de cadenas está listo para desplegarse en Blockchain Platform.
- Instalar Govendor:
- 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 entradacertificateAuthorities
y su entradaregistrar
. La contraseña del administrador se enmascara (se convierte en***
) ennetwork.yaml
cuando 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_User
para la instancia.
- Cree un nuevo usuario en IDCS (denominado
Implementación de la muestra de mármol de control de acceso detallado
Los siguientes pasos inscribirán al nuevo usuario e implantarán las restricciones de ACL mediante los scripts Node.js proporcionados.
- Inscripción del 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 solo permiten a los usuarios correctos realizar cada función, ejecutaremos algunos escenarios de ejemplo.
- Transferir mármol: estamos transfiriendo mármol
blue1
de tom a jerry. Dado 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: estamos transfiriendo el mármol
blue1
de jerry a spike. Dado 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: ahora consultaremos 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
redMarblesAcl
debe 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 ACLredMarblesAcl
debe 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
deleteMarbleAcl
permite 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
deleteMarbleAcl
debe 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. |