Continúo con la serie sobre Power BI Embedded y extendiendo la demo. Esta vez muestro cómo utilizar la API REST de Power BI para enviar la información del usuario y los roles desde la aplicación web hacia el servicio de Power BI, con el fin de aplicar RLS (seguridad de nivel de fila).
RLS en Power BI
En Power BI podemos restringir a qué filas del conjunto de datos tiene acceso un usuario, lo que se conoce con el término de «seguridad a nivel de fila» o RLS (por las siglas en inglés). Para implementarlo, creamos roles en el modelo de datos, utilizando Power BI Desktop, y para cada rol indicamos cómo filtrar las tablas del modelo, utilizando expresiones DAX. Estas expresiones pueden ser estáticas, por ejemplo, el rol España
filtra la tabla Paises
con la expresión [Codigo Pais] = "ES"
. O pueden ser dinámicas, utilizando la función USERNAME()
que devuelve el email del usuario. Por ejemplo, el rol Vendedor
filtra la tabla Vendedores
con la expresión [Email] = USERNAME()
.
La asignación de qué roles le corresponden a cada usuario se hace en el servicio de Power BI una vez que se ha publicado el modelo de datos.
RLS en Power BI Embedded
Con Power BI Embedded el acceso de los usuarios lo controla nuestra aplicación web y no el servicio de Power BI, por lo que es nuestra responsabilidad enviarle a Power BI la información del usuario y los roles. Para ello usamos la API REST de Power BI y en específico la API para crear un «Embed Token», de la que ya hablé en entradas anteriores.
Habíamos visto que para crear el «Embed Token» se le envía a la API el ID del informe y puede que también el ID del conjunto de datos. Para aplicar RLS hay que enviar además la información de identidad, que consiste en el usuario, los roles y el ID del conjunto de datos donde se va aplicar dicha identidad.
En el diagrama siguiente muestro el proceso para dos usuarios, en tres pasos:
- El usuario se identifica con la aplicación web. Este usuario tiene unos roles asignados en la configuración de la aplicación web.
- El backend de la aplicación web llama a la API REST de Power BI para generar el «Embed Token» y le envía el usuario y los roles.
- El «Embed Token» generado se utiliza en la configuración de la biblioteca JavaScript de Power BI, y esta se lo envía a Power BI, quien filtrará las filas del conjunto de datos acorde a las reglas de RLS.
El siguiente fragmento de código Python, que extiende el ejemplo de una entrada anterior, muestra cómo pasar la información de identidad a la API REST de Power BI.
Las líneas nuevas en este fragmento son de la 20 a la 27, donde se utilizan las siguientes variables:
rls_username
: Identificación del usuario. Suele ser un email pero puede ser cualquier cadena de textorls_roles
: Un arreglo con la lista de rolesdataset_id
: El ID del conjunto de datos sobre el que se va aplicar RLS
Demo
La demo consiste en un sitio web con Power BI Embedded y que utiliza una base de datos SQL para almacenar la configuración. El sitio da acceso a un informe de ventas que comparten dos empresas, una con el nombre BICICLETAS y la otra con el nombre ORDENADORES. Cada empresa tiene un conjunto de datos separados, pero el modelo de datos es el mismo, por lo que se puede usar el mismo informe. En los blogs anteriores hay más detalles.
Credenciales
Estos son los datos de acceso:
Sitio web: https://dataxbi-powerbi.azurewebsites.net
Usuario: demo-bicicletas
Contraseña: dataXbi2021
Usuario: demo-ordenadores
Contraseña: dataXbi2021
He extendido el sitio web para que se pueda utilizar RLS, y como resultado se puede acceder con 4 usuarios nuevos:
Usuario: demo-bicicletas-vendedor
Contraseña: dataXbi2021
Este usuario pertenece a un vendedor y sólo ve las ventas que él hizo.
Usuario: demo-bicicletas-ca
Contraseña: dataXbi2021
Este usuario sólo puede ver las ventas para las Comunidades Autónomas: Cataluña, Islas Baleares y Comunidad Valenciana.
Usuario: demo-ordenadores-vendedor
Contraseña: dataXbi2021
Este usuario pertenece a un vendedor y sólo ve las ventas que él hizo.
Usuario: demo-ordenadores-ca
Contraseña: dataXbi2021
Este usuario sólo puede ver las ventas para las Comunidades Autónomas: Andalucía, Asturias y Aragón.
Modelo
El modelo de Power BI lo he extendido con dos tablas de dimensiones:
Vendedores
: Tabla con los vendedores de la empresa y que se enlaza con la tabla de hechosVentas
.Comunidades Autónomas
: Tabla con las Comunidades Autónomas y que se enlaza con la tabla de dimensionesClientes
.
Roles
He creado roles estáticos para cada Comunidad Autónoma. Por ejemplo, el rol para Andalucía tiene el nombre CA-AN
y aplica el filtro [Codigo CA] = "ES-AN"
a la tabla Comunidades Autonomas
.
También he creado un rol dinámico con el nombre Vendedor
que aplica el filtro [Codigo Vendedor] = USERNAME()
a la tabla Vendedores
.
Aprovecho para hacer notar que en este modelo no estoy almacenando el email de los vendedores y que en el filtro comparo USERNAME() con el código del vendedor. Esto es porque al estar utilizando Power BI Embedded puedo pasar lo que desee como username
, y en este caso pasaré el código del vendedor, que estará guardado en la configuración de la aplicación web.
Informe
Al informe le he añadido dos gráficos de barras para mostrar las unidades vendidas por Comunidad Autónoma y las unidades vendidas por Vendedor.
Configuración
La configuración de los usuarios del sitio web la he extendido de la siguiente manera:
- Roles: Un usuario puede tener ningún, uno o varios roles asociados.
- Usuario Power BI: A un usuario se le puede indicar, opcionalmente, el
username
que se enviará a Power BI.
Cuando un usuario se identifica en la aplicación web, y el backend va a llamar a la API REST de Power BI para crear el «Embed Token», si el usuario tiene algún rol asociado, se envía la información de identificación. Para el username
, se utiliza el usuario de Power BI, si ha sido configurado, y sino se utiliza el nombre de usuario en la aplicación web, por ejemplo, demo-bicicletas-ca.
Además he creado los usuarios que mencioné antes, con la siguiente configuración:
- Usuario: demo-bicicletas-vendedor
- Roles: Vendedor
- Usuario Power BI: A0-000 (código de un vendedor)
- Usuario: demo-bicicletas-ca
- Roles: CA-CT, CA-IB, CA-VC
- Usuario: demo-ordenadores-vendedor
- Roles: Vendedor
- Usuario Power BI: A0-000 (código de un vendedor)
- Usuario: demo-ordenadores-ca
- Roles: CA-AN, CA-AS, CA-AR
Resultado
El resultado será, como es de esperar, que el informe estará filtrado acorde a los roles asignados al usuario. Por ejemplo, en las siguiente imagen muestro cómo se vería el informe para un usuario que tenga roles de Comunidades Autónomas.
Y en esta otra imagen se puede ver el informe para un usuario con un rol de Vendedor.
Referencias