[PowerBi] Seguridad a nivel de páginas RLS - Parte 2

Si queres conocer como hacer seguridad a nivel de página sin RLS podes ver nuestro post anterior.

En muchas oportunidades lo principal para los usuarios finales es estar seguros sobre que información será visible por quien. En estos escenarios suelo encontrarme con dos situaciones. Por un lado, evitar que un usuario tenga acceso a un informe y por otro lado que un usuario tenga restringida las páginas por filas. Pero que sucede cuando están involucradas las páginas que no son parte del informe y no es filtrado por fila.

Lo primero que nos recomienda Microsoft y muchos usuarios es separar las páginas en varios informes conectados a un único dataset para administrarlo como dos informes distintos en el servicio de Power Bi. Sin embargo, sigue sin resolver el problema que un usuario administrador vea todas las páginas en un informe y otros solo vean algunas de ellas sin tener que replicar informes conectados a un dataset por todas partes.

Este artículo nos ayudará a que nuestro rol en RLS se encargue de filtrar las páginas disponibles para cada usuario. La solución será de manera similar al post de hace dos semanas.

Lo principal que debemos entender es que la única forma de llegar a este resultado es forzar al informe a usar una navegación personalizada y no la predefinida por Power Bi. Me refiero a construir una página tipo menú visible y todas las demás invisibles. Algo semejante a como vimos en el post que generaba un menú inicio https://blog.ladataweb.com.ar/bookmarks-episodio-3/

La diferencia será que en lugar de usar bookmarks para navegar utilizaremos la acción "Page Navigation" con una medida que involucra la lógica detrás de la navegación.

Un poco de contexto teórico. Si colocamos una medida en la opción de función personalizada (FX) bajo la navegación el motor intentará dirigirse a una página que coincida con el texto que retorne le función. Para que nuestra medida funcione tenemos que garantizar que la respuesta sea un texto con el nombre exacto de la página a la cual navegar.

Modelo

De manera similar al post anterior de RLS vamos a construir una tabla no relacionada que podría estar administrada desde un excel alojado en un drive. La tabla contendrá dos columnas el correo del usuario y el nombre exacto de la página a la que tendría acceso.

image

Como pueden ver no solo necesitaríamos ir por cada usuario y cada página. También podríamos tener una restricción administradora con un texto único a chequear que en este caso es "Todo".

Con nuestra tabla creada podemos crear nuestro rol de RLS de manera muy sencilla:

image

DAX

Una vez preparado el modelo vamos a crear nuestras funciones DAX dentro de medidas para cada página. La idea es una medida por cada página que controlará nuestro acceso.

El código de ejemplo para nuestra página "Error in Totals" será:

Nav_Switcher =
VAR __nav = OR(
"Error in Totals" IN VALUES (UserByPage[PagePermission])
, "Todo" IN VALUES (UserByPage[PagePermission])
)
RETURN
IF ( __nav, "Error in Totals", "Denegado")

Vamos a preguntar si el texto Switcher que es el nombre de la página esta en las filas filtradas por RLS o en caso de que sea administrador. Nuestra variable devolverá un TRUE() si se cumple alguna de las condiciones. Para finalizar podemos construir un IF que devolverá el nombre de la página para navegar en caso de verdadero. En caso de falso podemos dejar "Blank()" evitando que algo suceda al clickear nuestro botón de navegación o podemos mejorar la experiencia de usuario con una página oculta de permiso restringido para que el usuario comprenda que no tiene acceso y por ello no puede llegar a la página deseada.

image

Colocamos nuestra función en el menú de acción del panel de formato de nuestro botón.

image

Así logramos construir la lógica de navegación que podremos probar libremente con algún rol particular.

image

De este modo hemos construido una posible forma de restringir páginas por usuarios bajo RLS y una tabla administrada por terceros que podrían no ser desarrolladores de Power Bi.

Espero que esto los ayude a abrir la mente a más soluciones creativas como esta que podría seguir mejorándose si ocultamos y mostramos los botones según los permisos y cosas de ese estilo.