# 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.