feat: rbac_check (pure), jwt_middleware, rbac_middleware
Fase 5 del issue 0010 — RBAC y middlewares de auth.
- rbac_check es pura: solo recorre la matriz roles/permisos
- jwt_middleware extrae token del header Authorization: Bearer, valida e
inyecta claims en el context con una key privada (jwtCtxKey struct{})
- rbac_middleware requiere jwt_middleware antes; lee role de claims.Custom
- Helper JWTClaimsFromContext para acceder a las claims desde handlers
- 401 claro si RBAC se usa sin JWT antes (code: no_claims)
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
---
|
||||
name: rbac_check
|
||||
kind: function
|
||||
lang: go
|
||||
domain: infra
|
||||
version: "1.0.0"
|
||||
purity: pure
|
||||
signature: "func RBACCheck(roles []Role, roleName string, perm Permission) bool"
|
||||
description: "Verifica si un rol tiene un permiso concreto. Busca el rol por Name e itera sus permisos buscando match exacto de Resource + Action. Funcion pura."
|
||||
tags: [rbac, role, permission, check, auth, infra]
|
||||
uses_functions: []
|
||||
uses_types: [Role_go_infra, Permission_go_infra]
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
params:
|
||||
- name: roles
|
||||
desc: "slice de roles disponibles en el sistema, cada uno con su lista de permisos"
|
||||
- name: roleName
|
||||
desc: "nombre del rol a verificar (ej: admin, viewer). Comparacion exacta"
|
||||
- name: perm
|
||||
desc: "permiso requerido: par Resource + Action (ej: users/delete)"
|
||||
output: "true si el rol existe y tiene el permiso; false si el rol no existe o no tiene el permiso"
|
||||
tested: true
|
||||
tests: ["true cuando el rol tiene el permiso", "false cuando no tiene el permiso", "false cuando el rol no existe", "match exacto de Resource y Action"]
|
||||
test_file_path: "functions/infra/rbac_check_test.go"
|
||||
file_path: "functions/infra/rbac_check.go"
|
||||
---
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```go
|
||||
roles := []Role{
|
||||
{Name: "admin", Permissions: []Permission{{Resource: "users", Action: "delete"}}},
|
||||
{Name: "viewer", Permissions: []Permission{{Resource: "users", Action: "read"}}},
|
||||
}
|
||||
can := RBACCheck(roles, "admin", Permission{Resource: "users", Action: "delete"})
|
||||
// can == true
|
||||
```
|
||||
|
||||
## Notas
|
||||
|
||||
Pura — solo recorre slices, sin I/O. No hay herencia ni wildcards: un rol "admin" sin el permiso explicito `users/delete` no lo tiene. Esto es deliberado para que la matriz rol→permisos sea auditable con un grep. Para wildcards o herencia, construir la lista de roles expandida antes de pasarla (ej: funcion helper que toma {admin: [viewer, ...]} y expande). Si hay dos Roles con el mismo Name solo se evalua el primero — considerar invariante de unicidad al construir la lista.
|
||||
Reference in New Issue
Block a user