ParkVision Docs
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

  1. El usuario se autentica y recibe un JWT token
  2. El token incluye los claims de permisos de todos sus roles
  3. El atributo [RequirePermission] verifica si el claim "Permission" con el código específico existe
  4. Si no existe, retorna 403 Forbidden

Convenciones de nomenclatura

ElementoConvenciónEjemplo
ResourceNombre del móduloCustomers, Roles, CashBox
ActionAcción específicaGetAll, Create, Update, Delete
CodeResource.ActionCustomers.GetVehicles
NameDescriptivo 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 ParkingIdentityDBContext

Paso 3: Aplicar migración

dotnet ef database update --context ParkingIdentityDBContext

Paso 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:

  1. Ir a Roles en el menú de configuración
  2. Editar el rol deseado
  3. Seleccionar el nuevo permiso
  4. 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