# Esquema de permisos, roles y usuarios La implementación de gestión de usuarios, roles y permisos entrega la estructura necesaria para administrar los usuarios, asignar roles con privilegios específicos y establecer permisos precisos para controlar la seguridad y el acceso adecuado a los recursos de la aplicación mediante el uso de diferentes tipos de permisos. ## Tipos de permisos - Módulos: Los permisos de tipo **módulo** son asignados únicamente para dar acceso al módulo descrito desde el menú de la aplicación. Tener un permiso no implica tener acceso a todos los recursos del módulo en sí. Un ejemplo de permiso de este tipo para el módulo de Administración es: `admin`. - Vistas: Los permisos de tipo **vista** permiten tener acceso a la visualización de una vista en su totalidad o parcial dentro de la aplicación. Un ejemplo de permiso de este tipo para visualizar la vista de Cotizador (_feelookup_) perteneciente al módulo Giros (_transfers_) es: `transfers.feelookup.view`. - Acciones: Los permisos de tipo **acción** cumplen el objetivo de permitir realizar acciones específicas dentro de la aplicación. Un ejemplo de permiso de este tipo para buscar los agentes dentro de la vista de Cotizador (_feelookup_) perteneciente al módulo Giros (_transfers_) es: `transfers.feelookup.findagents`. ### Tablas de dynamo Adicionalmente a los tipos de permisos descritos y que están destinados a dar acceso a un recursos en particular, existe otro tipo de permiso que permite el total acceso a leer o escribir directamente sobre una tabla en la base de datos de **Dynamo** mediante el servicio proxy ([ver documentación de **Dynamo Proxy**](https://youneedawiki.com/app/page/1mC0sQlyhrDPjP-2LeUJKlwqAmzo6Y2mFXKisZQVALvM)). Este permiso puede ser de lectura (_read_) ó escritura (_write_) y se conforma por el prefijo **dynamo.** seguidos del el nombre de la tabla junto al tipo de permiso. Ejemplos de lectura y escritura sobre la tabla de Usuarios (_users_) es: - Lecutura: `dynamo.users.read` - Escritura: `dynamo.users.write` El objetivo de este tipo de permisos es para la realización de tareas puntuales, evitando al máximo su uso y entendiendo el riesgo en la seguridad de la aplicación que implica una implementación errada de ellos. ## Lista de permisos ### Permisos especiales Además de los permisos definidos para el uso regular de los módulos de la aplicación, existen permisos con objetivos especiales que se describen a continuación: | Scope | Tipo | Descripción | | :---: | :--: | ----------- | | **superadmin** | N/A | Acceso total a todos los módulos, vistas y acciones en la aplicación. **Usar con precaución**. | ### Módulo Administración | Scope | Tipo | Descripción | | :---: | :--: | ----------- | | **admin** | Módulo | Mostrar Administración en menú. | | **admin.roles.view** | Vista | Visualizar pantalla con lista de roles. | | **admin.roles.create** | Acción | Crear un nuevo rol del sistema. | | **admin.roles.edit** | Acción | Editar un rol del sistema. | | **admin.users.view** | Vista | Visualizar pantalla con lista de usuarios. | | **admin.users.create** | Acción | Crear un nuevo usuario del sistema. | | **admin.users.edit** | Acción | Editar un usuario del sistema. | ### Módulo Giros | Scope | Tipo | Descripción | | :---: | :--: | ----------- | | **transfers** | Módulo |Mostrar Giros en menú. | | **transfers.feelookup.view** | Vista |Visualizar pantalla de cotizador. | | **clients.create** | Acción |Crear un nuevo cliente. | | **clients.search** | Acción |Buscar un cliente. | | **clients.details** | Acción |Obtener los datos de un cliente. | | **clients.edit** | Acción |Editar un cliente. | | **transfers.receivers.view** | Vista |Visualizar lista de beneficiarios. | | **transfers.details** | Acción |Obtener los datos de un giro. | | **transfers.view** | Vista |Visualizar lista de giros. | | **transfers.create** | Acción |Crear un nuevo giro. | | **transfers.edit** | Acción |Editar un giro. | | **transfers.search** | Acción |Buscar un giro. | ### Módulo Cumplimiento | Scope | Tipo | Descripción | | :---: | :--: | ----------- | | **compliance** | Módulo | Mostrar Cumplimiento en menú. | ### Módulo Cambios | Scope | Tipo | Descripción | | :---: | :--: | ----------- | | **exchange** | Módulo | Mostrar Cambios en menú. | ### Módulo Contabilidad | Scope | Tipo | Descripción | | :---: | :--: | ----------- | | **accounting** | Módulo | Mostrar Contabilidad en menú. | ### Módulo SVT | Scope | Tipo | Descripción | | :---: | :--: | ----------- | | **svt** | Módulo | Módulo Mostrar SVT en menú. | ## Asignacion de permisos a usuarios La asignación de permisos a usuarios se puede hacer de dos maneras: - Permisos granulares: La asignación de permisos granulares de usuario se realiza en la vista de creación/edición de usuario, mediante la selección de permisos por módulo y considera únicamente los permisos seleccionados. - Permisos por roles: La asignación de permisos por roles se realiza en la vista de creación/edición de usuario, mediante la selección de rol y considera todos los permisos que tiene asociados el rol seleccionado. La asignación de permisos a un rol se realiza en la vista de creación/edición de rol y se hace mediante la selección de permisos por módulo, considerando únicamente los permisos seleccionados. ## Estructuras Las estructuras utilizadas para gestionar permisos de usuarios y roles se detallan a continuación. ### Roles Los roles tienen una lista de permisos que se almacenan en el atributo `scope` que es un array de **string** con la lista de scope de la siguiente manera: ``` { ..., "scope": [ "SCOPE1", "SCOPE2", "SCOPE3", ... ] } ``` ### Usuarios A nivel de usuario, los permisos granulares se almacenan en el atributo `scope` que es un array de **string** con la lista de scope, mientras que los roles asociados al usuario se almacenan en el atributo `roles` que también es un array de **string** con la lista de `id` de roles, de la siguiente manera: ``` { ..., "roleId": "superAdminRoleId", } ``` Luego, el scope total del usuario considera los permisos granulares definidos en el `scope` como tambien los permisos definidos en los roles que tiene asociado en el `scope` de cada uno de ellos. ## Política de permisos Como se puede observar, la política utilizada en la implementación de permisos sigue un enfoque **permisivo**. Esto quiere decir que se permite el acceso a todo excepto a lo que está explícitamente denegado por un permiso, permitiendo restringir cada módulo, vista o acción en el tiempo según se vaya implementando partiendo por una definicion inicial de permisos. En conclusión, mientras no exista un permiso que prohiba acceder o realizar algo, no se necesitará agregar ese permiso al los roles o usuarios que lo utilizan.