🎯

Object-Level Security (OLS)

Oculta tablas y columnas sensibles a usuarios sin permisos. La capa que complementa a RLS cuando filtrar filas no basta.

Avanzado
💭

¿Qué es OLS?

"Esa columna no existe para ti"

Object-Level Security permite ocultar tablas completas o columnas concretas a determinados roles de seguridad. No se trata de hacerlas invisibles en la UI — se trata de hacerlas literalmente inexistentes para el motor cuando ese usuario consulta el modelo.

Cualquier visual, medida o consulta DAX que referencie un objeto restringido devolverá un error de "objeto no encontrado" para quien no tenga permiso. Es la forma más fuerte de proteger metadatos sensibles.

⚖️

OLS vs RLS

Dos capas que se complementan

RLS (filas)

  • Filtra qué filas ve cada usuario
  • La columna sigue existiendo
  • Se configura desde Power BI Desktop
  • Filtros DAX expresivos

OLS (objetos)

  • Oculta tablas o columnas enteras
  • El objeto no aparece ni en metadatos
  • Requiere herramientas externas (Tabular Editor)
  • Permiso "None" o "Read" por objeto

¿Cuándo combinarlos? Por ejemplo, en una tabla Empleados: RLS filtra los empleados visibles según el área del usuario, y OLS oculta la columna Salario a todo el mundo excepto al rol "RRHH".

🛠️

Configurar OLS paso a paso

Necesitas Tabular Editor (gratuito)

OLS no se configura desde Power BI Desktop. Hay que usar Tabular Editor 2 (gratuito y open source) o Tabular Editor 3.

Pasos:

  1. Crea los roles desde Desktop como harías con RLS (aunque no añadas filtros)
  2. Abre el archivo PBIX con Tabular Editor
  3. Despliega Roles → selecciona un rol → propiedad Table Permissions
  4. Marca la tabla o columna a proteger como None
  5. Guarda y publica

Estructura interna (TMDL / TMSL):

"roles": [
  {
    "name": "Sin RRHH",
    "tablePermissions": [
      {
        "name": "Empleados",
        "columnPermissions": [
          { "name": "Salario", "metadataPermission": "none" }
        ]
      }
    ]
  }
]
💡 Tip kawaii: Si quieres aplicar OLS a muchos modelos, escribe un script C# en Tabular Editor que lo automatice. Es muy potente para gobernar a escala. 🌸
🎬

Casos de uso reales

Cuándo OLS es la respuesta correcta

  • Datos sensibles de RRHH: salarios, valoraciones, datos médicos visibles solo para People Ops
  • Información financiera restringida: márgenes, costes unitarios, comisiones — visibles solo para Finanzas
  • Tablas de seguridad o auditoría: el propio mapeo de usuarios a permisos no debe ser visible para nadie
  • Información regulatoria: PII, datos de salud, datos financieros bajo SOX/GDPR/HIPAA
  • Datasets compartidos entre departamentos: un único modelo que cada área consume con su propia visión "recortada"
🚧

Limitaciones que duelen

Lo que tienes que tener en cuenta antes de comprometerte

  • Las medidas que referencian objetos ocultos también fallan. Si una medida usa una columna protegida, esa medida no funcionará para los roles que no pueden ver la columna.
  • Visuals existentes pueden romperse. Cuando un usuario sin permiso abre un informe que utiliza un objeto OLS, el visual mostrará un error en vez de los datos. Hay que diseñar informes "OLS-aware".
  • No funciona con Live Connection a datasets compartidos publicados sin OLS. Necesitas configurar OLS en el modelo origen.
  • Requiere herramientas externas: sin Tabular Editor o equivalente no puedes activarlo.
  • No protege exportaciones de datos previas: si la información ya ha salido a un Excel, ya está fuera.
⚠️ Ojo: OLS es potente pero rompe la experiencia si no se diseña bien. La regla práctica: si necesitas que un usuario "vea menos columnas" pero quieres que el informe siga funcionando, probablemente lo que quieres es una medida que devuelva BLANK() según el rol, no OLS. Reserva OLS para cuando realmente el metadato deba ser invisible.
🚀 Siguiente paso: Para proteger los datos también cuando salen del Service (exports, descargas), pasa a Sensitivity Labels y DLP.