API
Sistema de Permisos
Flujo completo del sistema de permisos y autorización de ParkVision. Cómo crear, asignar y verificar permisos.
Sistema de Permisos
ParkVision utiliza un sistema de permisos basado en roles. Cada endpoint del API puede protegerse con un permiso específico que se verifica automáticamente.
Flujo de verificación
- El usuario se autentica y recibe un JWT token
- El token incluye los claims de permisos de todos sus roles
- El atributo
[RequirePermission]verifica si el claim "Permission" con el código específico existe - Si no existe, retorna 403 Forbidden
Convenciones de nomenclatura
| Elemento | Convención | Ejemplo |
|---|---|---|
| Resource | Nombre del módulo | Customers, Roles, CashBox |
| Action | Acción específica | GetAll, Create, Update, Delete |
| Code | Resource.Action | Customers.GetVehicles |
| Name | Descriptivo en español | "Ver Vehículos de Cliente" |
Agregar un nuevo permiso
Paso 1: Agregar a la configuración
Editar Parking.Identity/Configurations/PermissionConfiguration.cs:
new Permission
{
Id = "a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7", // GUID fijo
Code = "Customers.GetVehicles",
Name = "Ver Vehículos de Cliente",
Description = "Permite ver los vehículos asociados a un cliente",
Resource = "Customers",
Action = "GetVehicles"
}Paso 2: Crear migración
cd Parking.Identity
dotnet ef migrations add AddPermission_GetVehicles --context ParkingIdentityDBContextPaso 3: Aplicar migración
dotnet ef database update --context ParkingIdentityDBContextPaso 4: Proteger el endpoint
[HttpGet("{customerId}/vehicles")]
[RequirePermission("Customers.GetVehicles")]
public async Task<ActionResult<RequestResponse>> GetCustomerVehicles(string customerId)
{
var query = new GetCustomerVehiclesQuery { CustomerId = customerId };
var result = await _mediator.Send(query);
return Ok(result);
}Paso 5: Asignar desde la UI
Los administradores asignan permisos a roles desde la interfaz:
- Ir a Roles en el menú de configuración
- Editar el rol deseado
- Seleccionar el nuevo permiso
- Guardar
Notas importantes
- IDs fijos: Usar GUIDs fijos para los permisos en lugar de
Guid.NewGuid()para evitar cambios en cada migración - Migraciones: Siempre crear una nueva migración cuando se agreguen permisos, no editar migraciones existentes
- Herencia: Los permisos se asignan a roles, no directamente a usuarios. Los usuarios heredan permisos de sus roles
- Verificación automática: El atributo
[RequirePermission]verifica automáticamente si el usuario tiene el permiso a través de sus roles