Permisos de usuario por roles¶
- Índice de contenidos
- Permisos de usuario por roles
En las secciones "proyectos" (gestión de proyectos) y "agentes" (gestión de delegaciones) se utiliza para permitir el acceso una asignación del usuario a cada proyecto/agente concreto a través de un rol (bien sea asignado directamente o bien esté asignado a través de un grupo de usuario).
Gestión de roles y permisos por rol¶
Los roles disponibles y los permisos de cada uno de estos roles son configurables desde la administración del sistema para la combinación:
- Sección
- Menú
- Controlador
- Acciones de Lectura ó Acciones de Modificación
Para poder gestionar de forma fácil los permisos de cada rol sin tener conocimiento detallado del código, el sistema utiliza los helpers de construcción del menú para preparar los selectores de los formularios de asignación de permisos: menu_seccion(seccion) para obtener las opciones de menú de una sección y controladores_menu(menu) para obtener los controladores utilizados en cada opción de menú.
Mecanismo de autorización¶
El sistema de autorización validará si el usuario puede o no puede acceder a una acción concreta de acuerdo a los siguientes criterios:
- El usuario es miembro del proyecto o agente (en adelante "objeto") y está asignado con un rol válido
- Existe un permiso otorgado para el menú y el controlador de este al que se está intentando acceder (params[:menu] y params[:controller])
- El estado "cambiar" del permiso anterior permite acceder a las acciones (params[:action]) del controlador anterior que comienzan por alguna de las siguientes palabras: "anadir|nuevo|editar|modificar|crear|eliminar":
queremos_modificar = params[:action] =~ /^(anadir|nuevo|editar|modificar|crear|eliminar)/
- El estado "ver" permite acceder a cualquier otra acción no contemplada en el caso anterior
El resultado final es el siguiente:
# Comprueba si el usuario dispone del rol necesario para la accion solicitada def comprobar_permisos_rol # Comprobamos si lo que se quiere es modificar segun el nombre de la accion queremos_modificar = params[:action] =~ /^(anadir|nuevo|editar|modificar|crear|eliminar)/ # Y establecemos el permiso buscado filtro_permisos = queremos_modificar ? {cambiar: true} : {ver: true} filtro_permisos[:menu] = params[:menu] filtro_permisos[:controlador] = params[:controller] # Obtiene los roles en el proyecto o en el agente permisos = PermisoXRol.joins(rol: :usuario_x_proyecto).where("rol.seccion" == params[:seccion]). where("usuario_x_proyecto.usuario_id" => @usuario_identificado.id, "usuario_x_proyecto.proyecto_id" => @proyecto.id). where(filtro_permisos) if @proyecto permisos = PermisoXRol.joins(rol: :usuario_x_agente).where("rol.seccion" == params[:seccion]). where("usuario_x_agente.usuario_id" => @usuario_identificado.id, "usuario_x_agente.agente_id" => @agente.id). where(filtro_permisos) if @agente return !permisos.empty? end
Autorización adicional. Flag "admin" del rol¶
En ocasiones no es suficiente con la definición de roles para determinar si un usuario puede o no puede modificar un elemento, pues hay elementos susceptibles de ser sólo modificados por un usuario "administrador" del proyecto o delegación. Con funcionamiento anterior, basado en roles estáticos, esto se cubría con el uso del rol "Coordinador".
Un ejemplo de estas funcionalidades especiales son:
- Editar documentos subidos por otro usuario a un espacio de proyecto o de delegación.
- Modificar el seguimiento de actividades, subactividades, indicadores, etc... subidos por otro usuario
- Modificar tareas asignadas a otro usuario
- ...
Con el funcionamiento actual no es posible fijar un comportamiento especial a un nombre de rol pues estos pueden cambiar arbitrariamente en cada instalación. Por lo tanto, para permitir este funcionamiento en los roles actuales, es necesario activar el checkbox "admin" en la administración de roles.
Al contrario de la autorización básica recogida en el controlador general (app/controllers/application_controller.rb) esta autorización adicional se implementa manualmente en los controladores o en las vistas que lo requieran.
P.ej.:
<% editable = valor.usuario_id == @usuario_identificado.id || UsuarioXProyecto.joins(:rol_asignado).where("rol.admin" => true).find_by_usuario_id_and_proyecto_id(@usuario_identificado.id, @proyecto.id) %>
Requisitos y estilos de codificación¶
Para que esta solución funcione es necesario tomar las siguientes consideraciones:
Asignación de permisos en cambios de submenús¶
Siempre que se incluya un nuevo controlador para usar en proyectos o agentes será necesario generar adicionalmente:
- Una migración para incluir los permisos sobre el nuevo seccion/menu/controlador segun permisos que pudieran resultar similares. P.ej.: si creamos un nuevo controlador para resúmenes de proyecto (resumen_detallado_proyecto) distinto al ya existente (resumen_proyecto), generaríamos en todos los roles de proyecto permisos para el nuevo similares a los existentes sobre el antiguo.
- Los nuevos roles por defecto para nuevas instalaciones en el fichero db/seeds.rb
Referenciar controladores "ocultos" en submenús¶
Los formularios de gestión de permisos leen los controladores disponibles para cada opción de menú (submenú) desde el helper controladores_menu(menu) donde se detalla el controlador utilizado para el submenú.
Por ejemplo, para la opción "Etapas, periodos y tasas de cambio" del menú de "Configuración" de proyectos, la entrada en el helper es así:
{rotulo: _("Etapas, periodos y tasas de cambio"), url: { controller: "datos_proyecto", action: "etapas"}Para el hash :url se define cual es el controlador a utilizar y será sobre él sobre el que se definirán los permisos.
Sin embargo hay situaciones en las que un controlador no es directamente referenciado. En el caso anterior, la gestión de etapas dispone de una definición de tasas de cambio a utilizar (controlador tasa_cambio) y la gestón de periodos dispone de asignación de tareas (controlador tarea).
Es necesario por lo tanto indicar en el helper que se están utilizando también estos otros controladores para que se pueda de esa forma incluir los permisos necesarios sobre ellos. Esto se hace incluyendo (cuando sea necesario) un nuevo hash otros:
{rotulo: _("Etapas, periodos y tasas de cambio"), url: { controller: "datos_proyecto", action: "etapas"}, otros: ["tasa_cambio", "tarea"] }
Descripción de permisos (a 26/11/2015)¶
Permisos para proyectos¶
Menú resumen¶
- info: Página de entrada
- tarea: Gestión de tareas relacionadas con el proyecto asignadas a ó por el usuario
- resumen_proyecto: Resúmenes generales del proyecto
- resumen: Resumen de proveedores involucrados en el proyecto
Menú configuracion¶
- datos_proyecto: Gestión de etapas y de relaciones del proyecto
- estado: Gestión de estados del workflow de un proyecto
- tasa_cambio: Gestión de tasas de cambio para presupuesto y gastos
- tarea: Tareas relacionadas con el usuario (asignadas por y a) en el proyecto
- partida_financiacion: Gestión del mapeo de partidas del financiador
- subpartida: Gestión de subpartidas del proyecto
- remanente: Cálculo de remanentes entre PACs (en convenios/programas)
- personal: Gestión de personal involucrado en el proyecto
- exportacion: Exportación de mapeo de partidas y subpartidas
- importacion: Importación de mapeo de partidas y subpartidas
Menú identificacion¶
- datos_proyecto_dinamicos: Gestión de datos dinámicos de identificación
- datos_proyecto: Gestión de datos de titulares de derecho
Menú formulacion¶
- matriz: Elaboración de la matriz del marco lógico
- indicador: Gestión de variables de indicadores
- cronograma: Cronograma planificado
- presupuesto_proyectos: Gestión del presupuesto por partidas de financiador
- presupuesto_actividad: Gestión del presupuesto por actividades
- presupuesto_detallado: Gestión del presupuesto detallado por meses
- resumen_proyecto: Resumen de formulación y carta de inicio de actividades
- exportacion: Exportación de matriz y presupuesto
- importacion: Importación de matriz y presupuesto
- comentario: Comentarios a presupuestos, indicadores, fv, …
- marcado: Marcado de presupuestos
Menú ejecucion_tecnica¶
- matriz: Seguimiento de OE y resultados
- actividad: Seguimiento de actividades y subactividades
- indicador: Seguimiento de indicadores y variables de indicador
- fuente_verificacion: Seguimiento de fuentes de verificación
- cronograma: Gestión del cronograma ejecutado
- datos_proyecto_dinamicos: Gestión de datos dinámicos de seguimiento y cierre
- comentario: Comentarios a oe, indicadores, actividades, fv, …
- documentos: Documentos asociados a fuentes de verificación
- resumen_proyecto: Resumen de presupuesto y de seguimiento presupuestadio de oficina
Menú ejecucion_economica¶
- gasto_proyectos: Gestión de gastos del proyecto, gastos cofinanciados y numeración de facturas
- pago: Gestión de pagos sobre los gastos
- contrato: Gestión de los contratos del proyecto
- transferencia: Gestión de movimientos bancarios relacionados con el proyecto
- exportacion: Exportación económica (gastos, transferencias)
- importacion: Importación económica (desactivado en OEI)
- documento: Documentos anexos a gastos y transferencias
- comentario: Comentarios a gastos y transferencias
- marcado: Marcados de gastos
Menú documentos_proyecto¶
- documento: Gestión de documentos del proyecto
- documento_busqueda: Búsqueda de documentos por etiquetas documentales
- comentario: Comentarios a documentos
Permisos para delegaciones¶
Menú resumen_agente¶
- info: Página de entrada a la oficina
- tarea: Tareas relacionadas con el usuario (asignadas por y a) en la oficina
- resumen_agente: Resúmenes generales de la oficina
- resumen: Resúmenes de proveedores dados de alta
- convocatoria: Resumen de seguimiento de convocatorias
En plugin oei_erp:
- oei_erp/resumen: Resumen de presupuesto y de seguimiento presupuestario de oficina
- oei_erp/resumen_acumulado: Resumen de presupuesto y de seguimiento presupuestario acumulado de todas las oficinas
Menú configuracion_agente¶
- datos_agente: Etapas de la oficina, monedas usadas, ...
- tasa_cambio: Gestión de tasas de cambio para presupuesto y gastos/ingresos
- subpartida: Gestión de subpartidas del agente (estructura)
- convocatoria: Gestión de convocatorias
- proyecto: Gestión de proyectos gestionados
- libro: Gestión de cuentas bancarias y cajas chicas
- proveedor: Gestión de proveedores dados de alta
- tipo_contrato: Gestión de tipos de contrato específicos de la oficina
- workflow_contrato: Gestión de condiciones documentales para el workflow de contratos (estados) particular de la oficina
- usuario: Gestión de la asignación de usuarios a proyectos y cuentas bancarias
- grupo_usuario: Gestión de la asignación de grupos a proyectos y cuentas bancarias
En plugin gor_contabilidad:
- contabilidad: Mapeo de centros de coste y cuentas contables para sincronización con contabilidad
- gor_contabilidad/log_contabilidad: Histórico de sincronizaciones contra contabilidad
En plugin oei_erp:
- oei_erp/sync: Sincronización de elementos contables básicos (financiadores, convenios, proyectos, cuentas bancarias, proveedores, ...)
- oei_erp/contrato: Exportación de contratos para sincronización con ERP
Menú economico_agente¶
- presupuesto_ingresos: Presupuesto de ingresos
- presupuesto_agentes: Presupuesto de gastos
- presupuesto_detallado: Presupuesto detallado por meses (para ingresos y para gastos)
- presupuesto_proyectos: Ayudas a la gestión de presupuestos
- ingreso: Gestión de ingresos
- gasto_agentes: Gestión de gastos ejecutados
- pago: Gestión de pagos sobre los gastos
- transferencia: Gestión de movimientos bancarios sobre cuentas/cajas de la oficina
- contrato: Gestión de contratos
- estado_contrato: Gestión de estados (workflow) de un contrato
- exportacion: Exportación económica (presupuesto, gastos y transferencias)
- importacion: Importación económica
- documento: Documentos anexos a gastos y transferencias
- comentario: Comentarios a presupuesto, ingresos, gastos y transferencias
- marcado: Marcados de presupuesto, ingresos y gastos
En plugin oei_erp:
- oei_erp/presupuesto: Presupuesto de gastos (estructura, personal, …). Sustituye a "presupuesto"
- oei_erp/importacion: Importación de presupuesto de oficina. Sustituye a "importacion"
- oei_erp/sync: Sincronización con el ERP de gastos, transferencias, ingresos, …
Menú documentos_agente¶
- documento: Gestión documental de la oficina
- documento_busqueda: Búsqueda de documentos por etiquetas documentales
- contrato: Exportación de documentos de un contrato
- comentario: Comentarios a documentos