package infra import "net/http" // RBACMiddleware retorna un Middleware que verifica que el usuario autenticado // tenga un permiso concreto. Requiere que JWTMiddleware se ejecute antes en la // chain (lee las claims del context). El rol se extrae de claims.Custom["role"]. // Responde 403 si el rol no tiene el permiso; 401 si no hay claims en el context. func RBACMiddleware(roles []Role, required Permission) Middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { claims, ok := JWTClaimsFromContext(r.Context()) if !ok { HTTPErrorResponse(w, HTTPError{ Status: http.StatusUnauthorized, Code: "no_claims", Message: "rbac_middleware requiere jwt_middleware antes en la chain", }) return } roleName, _ := claims.Custom["role"].(string) if roleName == "" || !RBACCheck(roles, roleName, required) { HTTPErrorResponse(w, HTTPError{ Status: http.StatusForbidden, Code: "forbidden", Message: "no tienes permiso para esta accion", }) return } next.ServeHTTP(w, r) }) } }