# US-MGN003-004: Control de Acceso RBAC

## Identificacion

| Campo | Valor |
|-------|-------|
| **ID** | US-MGN003-004 |
| **Modulo** | MGN-003 Roles/RBAC |
| **Sprint** | Sprint 2 |
| **Prioridad** | P0 - Critica |
| **Story Points** | 8 |
| **Estado** | Ready |
| **Autor** | System |
| **Fecha** | 2025-12-05 |

---

## Historia de Usuario

**Como** desarrollador del sistema
**Quiero** que el sistema valide automaticamente los permisos en cada request
**Para** garantizar que los usuarios solo accedan a funcionalidades autorizadas

---

## Criterios de Aceptacion

### Escenario 1: Acceso con permiso valido

```gherkin
Given un usuario con permiso "users:read"
  And endpoint GET /api/v1/users requiere "users:read"
When el usuario hace la solicitud
Then el sistema permite el acceso
  And retorna status 200 con los datos
```

### Escenario 2: Acceso denegado

```gherkin
Given un usuario con permiso "users:read" solamente
  And endpoint DELETE /api/v1/users/:id requiere "users:delete"
When el usuario intenta eliminar
Then el sistema retorna status 403
  And el mensaje es "No tienes permiso para realizar esta accion"
  And NO revela que permiso falta (seguridad)
```

### Escenario 3: Wildcard permite acceso

```gherkin
Given un usuario con permiso "users:*"
  And endpoint requiere "users:delete"
When el usuario hace la solicitud
Then el sistema permite el acceso
  And wildcard cubre el permiso especifico
```

### Escenario 4: Super Admin bypass

```gherkin
Given un usuario con rol "super_admin"
  And endpoint requiere "cualquier:permiso"
When el usuario hace la solicitud
Then el sistema permite el acceso
  And no valida permisos especificos
```

### Escenario 5: Permisos alternativos (OR)

```gherkin
Given endpoint con @AnyPermission('users:update', 'users:admin')
  And usuario tiene solo "users:admin"
When el usuario hace la solicitud
Then el sistema permite el acceso
  And basta con tener UNO de los permisos
```

### Escenario 6: Owner puede acceder

```gherkin
Given endpoint PATCH /api/v1/users/:id con @OwnerOrPermission('users:update')
  And usuario accede a su propio perfil (id = su id)
  And usuario NO tiene permiso "users:update"
When el usuario actualiza su perfil
Then el sistema permite el acceso
  And ser owner del recurso es suficiente
```

### Escenario 7: Cache de permisos

```gherkin
Given permisos de usuario cacheados
When el admin cambia roles del usuario
Then el cache se invalida inmediatamente
  And siguiente request recalcula permisos
```

---

## Mockup / Wireframe

```
Flujo de validacion (interno del sistema):

┌─────────────────────────────────────────────────────────────────┐
│                    Request HTTP                                  │
│                         │                                        │
│                         ▼                                        │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  1. JwtAuthGuard                                         │   │
│  │     - Valida token JWT                                   │   │
│  │     - Extrae usuario del token                           │   │
│  └─────────────────────────────────────────────────────────┘   │
│                         │                                        │
│                         ▼                                        │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  2. TenantGuard                                          │   │
│  │     - Verifica tenant del usuario                        │   │
│  │     - Aplica contexto de tenant                          │   │
│  └─────────────────────────────────────────────────────────┘   │
│                         │                                        │
│                         ▼                                        │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  3. RbacGuard                                            │   │
│  │     - Lee decoradores @Permissions, @Roles               │   │
│  │     - Obtiene permisos efectivos (cache 5min)            │   │
│  │     - Valida segun modo (AND/OR)                         │   │
│  │     - Super Admin bypass                                 │   │
│  └─────────────────────────────────────────────────────────┘   │
│                         │                                        │
│                         ▼                                        │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  4. Controller                                           │   │
│  │     - Ejecuta logica de negocio                          │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘
```

---

## Notas Tecnicas

### Decoradores Disponibles

```typescript
// Requiere TODOS los permisos (AND)
@Permissions('users:read', 'users:update')

// Requiere AL MENOS UNO (OR)
@AnyPermission('users:update', 'users:admin')

// Requiere uno de los roles
@Roles('admin', 'manager')

// Ruta publica (sin auth)
@Public()

// Owner o permiso
@OwnerOrPermission('users:update')
```

### Uso en Controllers

```typescript
@Controller('api/v1/users')
@UseGuards(JwtAuthGuard, TenantGuard, RbacGuard)
export class UsersController {

  @Get()
  @Permissions('users:read')
  findAll() { }

  @Delete(':id')
  @Permissions('users:delete')
  remove() { }

  @Patch(':id')
  @OwnerOrPermission('users:update')
  update() { }
}
```

### Cache de Permisos

```typescript
// TTL: 5 minutos
// Key: rbac:permissions:{userId}
// Invalidacion: al cambiar roles del usuario
```

---

## Definicion de Done

- [ ] Decoradores @Permissions, @AnyPermission, @Roles
- [ ] Decorador @Public para rutas sin auth
- [ ] Decorador @OwnerOrPermission
- [ ] RbacGuard implementado
- [ ] OwnerGuard implementado
- [ ] Cache de permisos en Redis
- [ ] Invalidacion de cache automatica
- [ ] Log de accesos denegados
- [ ] Tests unitarios para guards
- [ ] Tests de integracion RBAC
- [ ] Code review aprobado

---

## Estimacion

| Tarea | Horas |
|-------|-------|
| Backend: Decoradores | 2h |
| Backend: RbacGuard | 4h |
| Backend: OwnerGuard | 2h |
| Backend: Cache service | 2h |
| Backend: Invalidacion cache | 2h |
| Backend: Tests guards | 3h |
| Backend: Tests integracion | 3h |
| **Total** | **18h** |

---

## Historial

| Version | Fecha | Autor | Cambios |
|---------|-------|-------|---------|
| 1.0 | 2025-12-05 | System | Creacion inicial |
