Cómo administrar permisos con Raspberry PLC y Node-RED

Crea un flujo Node-RED para controlar y gestionar los permisos de usuario
21 de noviembre de 2022 por
Cómo administrar permisos con Raspberry PLC y Node-RED
Boot & Work Corp. S.L., Bernat Brunet Pedra

Introducción

La gestión de permisos es clave para ayudar a los administradores del sistema a controlar a todos los usuarios y sus derechos de acceso para leer, escribir y modificar archivos en un sistema. La visibilidad de algunos archivos también está controlada por los permisos, por lo que una buena herramienta para gestionarlos es esencial.

Node-RED ofrece una manera fácil de controlar los permisos con los nodos del Tablero, así que pongámonos a ello.

How to manage permissions with Raspberry PLC and Node-RED

Requisitos


Configuración inicial

Lo que vas a hacer primero es crear usuarios con sus contraseñas y su número de nivel de acceso. En el ejemplo se utiliza el 0 para los administradores y el 1 para los usuarios comunes.

Arrastra un nodo de inyección y configúralo para que inyecte uno después de 0,1 segundos. A continuación, utilice un nodo de función que establecerá la configuración inicial para todos los usuarios. Puedes usar el código de abajo y modificarlo a tu gusto::

flow.set("permissions",[
    {show: ["Dashboard_Vars","Dashboard_Temperature","Dashboard_Logout"],hide: ["Dashboard_Login"]},
    {show: ["Dashboard_Temperature","Dashboard_Logout"],hide: ["Dashboard_Login"]}
]);
flow.set("all_credentials",[
    {user: "admin", password: "admin", access: 0},
    {user: "is", password: "is", access: 1},
]);
msg.payload = {group: {
    show: ["Dashboard_Login"],
    hide: ["Dashboard_Vars","Dashboard_Temperature","Dashboard_Logout"]
}};
return msg;

La variable "permissions" es para establecer qué pestañas pueden ver los usuarios cuando entran en el Dashboard. La posición 0 del array será para el nivel de acceso 0 y la posición 1 para el nivel de acceso 1...

La variable "all_credential" se utilizará para crear todos los nombres de usuario, contraseñas y niveles de acceso. Recuerda que debe haber tantos niveles de acceso como elementos en el array "permissions".

Finalmente, el msg.payload llevará al usuario a la pantalla de inicio de sesión y ocultará todas las demás pestañas para que el usuario inicie sesión.

Adjunta un nodo de control ui con la Salida: "Conectar, perder, cambiar pestaña o eventos de grupo". Después de configurar el sistema, añada un nodo form y configúralo así:

Form node

A continuación, añade otro nodo de función para conceder acceso en función de las credenciales introducidas por el usuario:

var all_credentials = flow.get("all_credentials");
var input_credentials = msg.payload;
msg.payload = -1;
all_credentials.forEach(function(credential) {
    if (input_credentials.user == credential.user) {
        if (input_credentials.password == credential.password) {
            msg.payload = credential.access;
        }
    }
});
return msg;

El msg.payload devuelto por esta función es el nivel de acceso del usuario. Si el usuario no está en la matriz "all_credential", entonces msg.payload es -1.

Después del nodo de función, añade un nodo de conmutación con estos parámetros:

Nodo de conmutación
Filtrará los usuarios malos y los buenos. En la primera salida, utilice otro nodo de función con:

msg.payload = "Invalid user / password";
return msg;

Utiliza un nodo de notificación para avisar al usuario de que las credenciales son incorrectas, añadiéndolo al nodo anterior. En la segunda salida, añade un nodo de función con el siguiente código:

msg.payload = {group: flow.get("permissions")[msg.payload]};
return msg;

Si intentas iniciar sesión con un nombre de usuario o una contraseña incorrectos, verás un mensaje como este:

Mensaje de usuario / contraseña no válidos

Por último, adjunta un nodo de control ui al último nodo de función con "Conectar, perder, cambiar pestañas o eventos de grupo" como salida. El flujo resultante debería tener este aspecto:

Flujo resultante


Pestañas adicionales y botón de cierre de sesión

Ahora añadirás algunas pestañas y un botón de cierre de sesión. Para implementar el botón de cierre de sesión, arrastra un nodo botón desde Node-RED Dashboard y adjúntale un nodo función. Pega este código en él:

msg.payload = {group: {
    show: ["Dashboard_Login"],
    hide: ["Dashboard_Vars","Dashboard_Temperature","Dashboard_Logout"]
    }
};
return msg;

Gracias a este código, todas las pestañas se ocultarán y solo la pestaña Login se mostrará como se deseas. Recuerda añadir otro nodo ui control con la misma configuración que el otro para actualizar la pestaña Dashboard. 

Para crear más pestañas, utiliza nodos gauge con sus propios grupos pero con la misma pestaña. Para seguir el ejemplo añade 2 grupos llamados "Temperatura" y "Vars". 

El flujo final es:

Flujo final

La pestaña superior del panel de control es para el usuario "admin", y la segunda para el usuario "is".

Panel de control

[{"id":"6547582a85d1894c","type":"ui_form","z":"d532948a1b537967","name":"","label":"","group":"b82da486.9fc8d8","order":0,"width":"6","height":"3","options":[{"label":"user","value":"user","type":"text","required":true,"rows":null},{"label":"password","value":"password","type":"password","required":true,"rows":null}],"formValue":{"user":"","password":""},"payload":"","submit":"Login","cancel":"cancel","topic":"topic","topicType":"msg","splitLayout":"","className":"","x":110,"y":120,"wires":[["9980ef1cf3df35b5"]]},{"id":"9980ef1cf3df35b5","type":"function","z":"d532948a1b537967","name":"Account Verification","func":"var all_credentials = flow.get(\"all_credentials\");\n\nvar input_credentials = msg.payload;\nmsg.payload = -1;\n\nall_credentials.forEach(function(credential) {\n    if (input_credentials.user == credential.user) {\n        if (input_credentials.password == credential.password) {\n            msg.payload = credential.access;\n        }\n    }\n});\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":150,"y":160,"wires":[["50287406ab04691e"]]},{"id":"50287406ab04691e","type":"switch","z":"d532948a1b537967","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"-1","vt":"num"},{"t":"gte","v":"0","vt":"num"}],"checkall":"false","repair":false,"outputs":2,"x":310,"y":160,"wires":[["f2ef4626d978c8cb"],["207c81ac6aebbb41"]]},{"id":"162f94c223714e02","type":"inject","z":"d532948a1b537967","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"512","payloadType":"str","x":130,"y":260,"wires":[["09d75f205b9edbd4"]]},{"id":"734ecddc359a8af0","type":"ui_ui_control","z":"d532948a1b537967","name":"Go ","events":"all","x":690,"y":180,"wires":[[]]},{"id":"e36877220f4e7c54","type":"inject","z":"d532948a1b537967","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"244","payloadType":"str","x":130,"y":300,"wires":[["09d75f205b9edbd4"]]},{"id":"f4c81ab4d6293ced","type":"function","z":"d532948a1b537967","name":"Initial Configuration","func":"flow.set(\"permissions\",[\n    {show : [\"Dashboard_Vars\", \"Dashboard_Temperature\",\"Dashboard_Logout\"],hide : [\"Dashboard_Login\"]},\n    {show : [\"Dashboard_Temperature\",\"Dashboard_Logout\"], hide : [\"Dashboard_Login\", \"Dashboard_Vars\"]}\n]);\n\nflow.set(\"all_credentials\", [\n    { user: \"admin\", password: \"admin\", access: 0 },\n    { user: \"is\", password: \"is\", access: 1}\n]);\n\n// by default\nmsg.payload = { group: {\n    show : [\"Dashboard_Login\"],\n    hide : [\"Dashboard_Vars\", \"Dashboard_Temperature\",\"Dashboard_Logout\"]\n    }\n};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":150,"y":80,"wires":[["d48a4bbd999acef4"]]},{"id":"b6dbac06073c8839","type":"inject","z":"d532948a1b537967","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":"0.1","topic":"","payload":"","payloadType":"date","x":130,"y":40,"wires":[["f4c81ab4d6293ced"]]},{"id":"fffe467df4191656","type":"inject","z":"d532948a1b537967","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"str","x":130,"y":220,"wires":[["09d75f205b9edbd4"]]},{"id":"d48a4bbd999acef4","type":"ui_ui_control","z":"d532948a1b537967","name":"Init Signin","events":"all","x":320,"y":80,"wires":[["6547582a85d1894c"]]},{"id":"c94db67dcaca1b9c","type":"ui_toast","z":"d532948a1b537967","position":"dialog","displayTime":"3","highlight":"","sendall":true,"outputs":1,"ok":"Try again","cancel":"","raw":false,"className":"","topic":"","name":"Error credentials","x":680,"y":140,"wires":[[]]},{"id":"f2ef4626d978c8cb","type":"function","z":"d532948a1b537967","name":"Redirection group -1","func":"msg.payload = \"Invalid user / password\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":140,"wires":[["c94db67dcaca1b9c"]]},{"id":"54e408d40f9e356c","type":"ui_gauge","z":"d532948a1b537967","name":"","group":"890b942dcf34b138","order":1,"width":0,"height":0,"gtype":"gage","title":"Temperature","label":"units","format":"{{value}}","min":0,"max":"1024","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","className":"","x":270,"y":400,"wires":[]},{"id":"b3e190aceb4cf92a","type":"inject","z":"d532948a1b537967","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"512","payloadType":"str","x":130,"y":400,"wires":[["54e408d40f9e356c"]]},{"id":"dde730b3fd21156a","type":"inject","z":"d532948a1b537967","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"244","payloadType":"str","x":130,"y":440,"wires":[["54e408d40f9e356c"]]},{"id":"bdd6d7fa5e3ff1fa","type":"inject","z":"d532948a1b537967","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"str","x":130,"y":360,"wires":[["54e408d40f9e356c"]]},{"id":"207c81ac6aebbb41","type":"function","z":"d532948a1b537967","name":"Redirection of other groups","func":"msg.payload = { group : flow.get(\"permissions\")[msg.payload] };\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":180,"wires":[["734ecddc359a8af0"]]},{"id":"46f0f1db5cda4bdd","type":"ui_button","z":"d532948a1b537967","name":"","group":"7d39d06cc1795486","order":1,"width":0,"height":0,"passthru":false,"label":"Exit","tooltip":"","color":"","bgcolor":"","className":"","icon":"","payload":"true","payloadType":"bool","topic":"topic","topicType":"msg","x":270,"y":340,"wires":[["5ac4584ceed46916"]]},{"id":"5ac4584ceed46916","type":"function","z":"d532948a1b537967","name":"Logout Button","func":"msg.payload = { group: {\n    show : [\"Dashboard_Login\"],\n    hide : [\"Dashboard_Vars\", \"Dashboard_Temperature\",\"Dashboard_Logout\"]\n    }\n};\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":420,"y":340,"wires":[["a36f37eab1a6a3e7"]]},{"id":"a36f37eab1a6a3e7","type":"ui_ui_control","z":"d532948a1b537967","name":"Go ","events":"all","x":570,"y":340,"wires":[[]]},{"id":"09d75f205b9edbd4","type":"ui_gauge","z":"d532948a1b537967","name":"","group":"6c6ab64226fafc58","order":1,"width":0,"height":0,"gtype":"gage","title":"Vars","label":"units","format":"{{value}}","min":0,"max":"1024","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","className":"","x":250,"y":260,"wires":[]},{"id":"b82da486.9fc8d8","type":"ui_group","name":"Login","tab":"d65502b1.ee517","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"890b942dcf34b138","type":"ui_group","name":"Temperature","tab":"d65502b1.ee517","order":3,"disp":true,"width":"6","collapse":false,"className":""},{"id":"7d39d06cc1795486","type":"ui_group","name":"Logout","tab":"d65502b1.ee517","order":4,"disp":true,"width":"6","collapse":false,"className":""},{"id":"6c6ab64226fafc58","type":"ui_group","name":"Vars","tab":"d65502b1.ee517","order":2,"disp":true,"width":"6","collapse":false,"className":""},{"id":"d65502b1.ee517","type":"ui_tab","name":"Dashboard","icon":"dashboard","order":1}]

Para añadir más grupos recuerds que tendrás que cambiar el nodo "Configuración inicial" y cambiar los nombres, niveles de acceso o valores de permiso a su gusto.

Crea un flujo Node-RED para controlar y gestionar los permisos de los usuarios

Y eso es todo.

Gracias a este blog has aprendido los conceptos básicos de la gestión de permisos y cómo trabajar con ellos.

Ahora ya puedes gestionar los permisos y trabajar con ellos.


Buscar en nuestro blog

Cómo administrar permisos con Raspberry PLC y Node-RED
Boot & Work Corp. S.L., Bernat Brunet Pedra 21 de noviembre de 2022
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>