Inicio / Power BI / Power BI: Dashboards e Informes Profesionales / Seguridad a Nivel de Fila (RLS)

Seguridad a Nivel de Fila (RLS)

Configura RLS estática y dinámica con USERPRINCIPALNAME(). Roles, pruebas y patrones avanzados de seguridad.

Intermedio
🔒 Solo lectura
📖

Estás en modo lectura

Puedes leer toda la lección, pero para marcar progreso, hacer ejercicios y ganar XP necesitas una cuenta Pro.

Desbloquear por $9/mes

Seguridad a Nivel de Fila (RLS)

La seguridad a nivel de fila (Row-Level Security, RLS) controla qué datos puede ver cada usuario. Un vendedor solo ve sus ventas, un gerente regional solo ve su región.

¿Qué es RLS?

RLS filtra los datos antes de que lleguen al usuario. No se trata de ocultar visualizaciones sino de restringir las filas de datos que cada rol puede ver.

Usuario: Juan (Vendedor - Región Norte)
  → Ve solo: Ventas WHERE Región = "Norte"

Usuario: María (Gerente Nacional)  
  → Ve todo: Ventas (sin restricción)

Crear roles en Power BI Desktop

Paso 1: Definir roles

  1. Ve a Modelado → Administrar roles.
  2. Clic en Crear para agregar un nuevo rol.
  3. Nombre del rol: Vendedor Norte.
  4. Selecciona la tabla sobre la que aplica el filtro.
  5. Escribe la expresión DAX del filtro.

Expresiones de filtro DAX

// Filtro simple por región
[Región] = "Norte"

// Filtro por país
[País] = "México"

// Filtro por departamento
[Departamento] = "Ventas"

// Filtro dinámico por email del usuario
[Email] = USERPRINCIPALNAME()

Paso 2: RLS dinámica con USERPRINCIPALNAME()

La forma más escalable es usar USERPRINCIPALNAME(), que devuelve el email del usuario autenticado:

// En la tabla Vendedores, filtrar por el email del usuario conectado
[Email] = USERPRINCIPALNAME()

Arquitectura

Tabla Vendedores:
| VendedorID | Nombre      | Email               | Región |
|-----------|-------------|---------------------|--------|
| 1         | Juan Pérez  | juan@empresa.com    | Norte  |
| 2         | María López | maria@empresa.com   | Sur    |
| 3         | Carlos      | carlos@empresa.com  | Centro |

Tabla Ventas:
| VentaID | VendedorID | Monto   | Fecha      |
|---------|-----------|---------|------------|
| 101     | 1         | $5,000  | 2026-01-15 |
| 102     | 2         | $3,000  | 2026-01-16 |

Con la relación Vendedores[VendedorID] → Ventas[VendedorID] y el filtro RLS [Email] = USERPRINCIPALNAME() en la tabla Vendedores, cada vendedor solo ve sus ventas automáticamente.

Probar roles en Desktop

  1. Ve a Modelado → Ver como → Selecciona el rol que quieres probar.
  2. Opcionalmente, marca Otro usuario e ingresa un email.
  3. El reporte se muestra con los datos filtrados por ese rol.
  4. Haz clic en Detener ver para volver al modo normal.

Configurar RLS en Power BI Service

Asignar usuarios a roles

  1. Ve al workspace → Dataset → tres puntos → Seguridad.
  2. Selecciona el rol.
  3. Agrega los usuarios o grupos de seguridad (Azure AD).
Rol: Vendedor Norte
  → juan@empresa.com
  → pedro@empresa.com

Rol: Vendedor Sur
  → maria@empresa.com

Rol: Gerente Nacional
  → (sin filtro, ve todo)

Patrones avanzados de RLS

Jerarquía de gestión

Un gerente regional ve los datos de todos los vendedores de su región:

// Tabla Regiones con columna GerenteEmail
[GerenteEmail] = USERPRINCIPALNAME()

Con la relación Regiones → Vendedores → Ventas, el filtro se propaga automáticamente.

Múltiples roles por usuario

Si un usuario pertenece a varios roles, Power BI une (OR) los filtros:

Juan tiene rol "Norte" y "Centro"
→ Ve datos de Norte OR Centro

RLS con tabla de seguridad

Para control granular, crea una tabla de seguridad:

Tabla Permisos:
| Email              | Región | Departamento |
|-------------------|--------|-------------|
| juan@empresa.com  | Norte  | Ventas      |
| juan@empresa.com  | Norte  | Soporte     |
| maria@empresa.com | Sur    | Ventas      |
| admin@empresa.com | *      | *           |
// Expresión DAX del rol:
[Email] = USERPRINCIPALNAME()

Con relaciones desde Permisos hacia las tablas de dimensión, cada usuario ve solo lo que tiene asignado.

Super usuario (admin)

// En la tabla de permisos, un usuario con "*" ve todo
VAR esAdmin = 
    COUNTROWS(
        FILTER(
            Permisos, 
            Permisos[Email] = USERPRINCIPALNAME() && 
            Permisos[Región] = "*"
        )
    ) > 0
RETURN
    IF(esAdmin, TRUE(), [Región] = LOOKUPVALUE(...))

RLS y DirectQuery

RLS funciona tanto con Import como con DirectQuery. En DirectQuery, los filtros de RLS se traducen en cláusulas WHERE de SQL enviadas al servidor, lo cual es eficiente.

Buenas prácticas de RLS

  1. Usa USERPRINCIPALNAME() para RLS dinámica — evita crear un rol por usuario.
  2. Prueba siempre con "Ver como" antes de publicar.
  3. Documenta los roles y quién tiene acceso a qué.
  4. No des más acceso del necesario — principio de menor privilegio.
  5. Usa grupos de Azure AD en vez de usuarios individuales para facilitar la gestión.

Resumen

RLS controla qué filas ve cada usuario sin cambiar el reporte. USERPRINCIPALNAME() permite RLS dinámica basada en el email del usuario. Las relaciones del modelo propagan los filtros de seguridad automáticamente. Siempre prueba con "Ver como" antes de publicar.

🔒

Ejercicio práctico disponible

Configura seguridad a nivel de fila (RLS)

Desbloquear ejercicios
// Configura seguridad a nivel de fila (RLS)
// Desbloquea Pro para acceder a este ejercicio
// y ganar +50 XP al completarlo

function ejemplo() {
    // Tu código aquí...
}

¿Te gustó esta lección?

Con Pro puedes marcar progreso, hacer ejercicios, tomar quizzes, ganar XP y obtener tu constancia.

Ver planes desde $9/mes