Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Administrator
8 months ago
Solved

Dimensiones adicionales de filtrado RLS

¡Hola!

Puedo necesitar tu ayuda con una pregunta sobre Seguridad a Nivel de Fila.

Tengo un modelo en el que apliqué RLS basado en el UPN, que funciona bien.
RLS filtra la tabla Team (puente), que a su vez filtra Regelingen (dim), que filtra Registraties (hecho) y otras tablas de hechos.

También tenemos las dimensiones Behandelaar y Reviewer, que ambas cuentan con una larga lista de empleados. Ambos tienen una columna Equipo que corresponde con el equipo de columna en la tabla Equipo.


Mi pregunta:
Me gustaría filtrar tanto las dimensiones de Behandelaar como las de revisores basándome en los Teams filtrados por RLS, para que los usuarios solo vean el Behandelaren y los revisores de su propio equipo en los slicers. He intentado añadir a Behandelaren[Equipo] EN VALORES(Equipo[Equipo]) y Revisor[Equipo] EN VALORES(Equipo[Equipo]) en el rol de UPN. Pero eso no parece funcionar.

¿Cuál sería la forma correcta y más limpia de que los slicers basados en Behandelaar y Reviewer muestren solo empleados del equipo? Hay múltiples tablas de factos en el modelo, por lo que se necesitan las dimensiones.

  • Hola @Chewdata

    Tu enfoque es correcto; Necesitas añadir restricciones para Behandelaren y los Revisores al rol RLS, pero la expresión que usaste es incorrecta.

    Primero deberías filtrar los permisos de Teams que tiene el usuario actual y luego usar esos elementos para restringir a Behandelaren y a los revisores.

    En resumen, necesitas cambiar Behandelaren[Equipo] EN VALORES(Equipo[Equipo]) a:

    VAR AccessTeamItems = 
        CALCULATETABLE(
            VALUES(RLS[Team]),
            RLS[UPN]=USENAME(),
            ALL()
        )
    RETURN
    Behandelaren[Team] IN AccessTeamItems
    // Reviewers[Team] IN AccessTeamItems

    ¿He respondido a tu pregunta? Si es así, por favor marcad mi publicación como solución y ¡agradece tus kudos!

    Gracias~

5 Replies

  • ¡Hola @Chewdata

    Añadir reglas RLS separadas en las tablas de Behandelaar y Revisor usando [Team] IN VALUES(Team[Team]) para que hereden la misma restricción de equipo creada por el filtro UPN en la tabla de equipos; Esta es la forma más limpia y soportada de hacer que los slicers muestren solo empleados del propio equipo del usuario.

  • Hola @Chewdata

    Tu enfoque es correcto; Necesitas añadir restricciones para Behandelaren y los Revisores al rol RLS, pero la expresión que usaste es incorrecta.

    Primero deberías filtrar los permisos de Teams que tiene el usuario actual y luego usar esos elementos para restringir a Behandelaren y a los revisores.

    En resumen, necesitas cambiar Behandelaren[Equipo] EN VALORES(Equipo[Equipo]) a:

    VAR AccessTeamItems = 
        CALCULATETABLE(
            VALUES(RLS[Team]),
            RLS[UPN]=USENAME(),
            ALL()
        )
    RETURN
    Behandelaren[Team] IN AccessTeamItems
    // Reviewers[Team] IN AccessTeamItems

    ¿He respondido a tu pregunta? Si es así, por favor marcad mi publicación como solución y ¡agradece tus kudos!

    Gracias~

  • La solución más limpia es dejar que el modelo de datos haga el trabajo en lugar de intentar forzarlo con VALUES() dentro del rol RLS.

    Tu RLS ya funciona así:

    RLS (UPN) → Equipo → Reglamentos → Registros (+ otros datos)

    Para asegurarte de que Behandelaar y Reviewer se filtren igual, simplemente conéctalos también con Team :

    • Relación: Equipo[Equipo] (1) → Behandelaar[Equipo] (*)

    • Relación: Equipo[Equipo] (1) Revisor →[Equipo] (*)

    • Dirección de filtro cruzado: Simple (de Equipo a la dimensión es suficiente)

    Mantén tu RLS tal cual está en la tabla RLS/Usuarios (RLS[UPN] = USERPRINCIPALNAME()).

    Dado que RLS ya filtra la tabla Equipo , ese filtro se propagará automáticamente a través de estas relaciones y restringirá ambas dimensiones. Tus slicers para Behandelaar y Reviewer solo mostrarán a los empleados de los equipos permitidos, sin necesidad de condiciones adicionales de DAX.

    Así que la clave es: resolverlo en el modelo, no en la expresión VALUES().

    RLS (Usuarios)
    |
    | 1:* (RLS filtra equipos mediante UPN → mapeo de equipos)
    v
    Equipo
    ├── 1:* → Reglamentos → 1:* → Registros
    ├── 1:* → Practicante
    └── 1:* → Reseñador

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Administrator

      Parece una respuesta de IA, Teams no puede conectarse a las tablas de Behandelaren o Revisores porque eventualmente controlarán la tabla de Registros, lo que resultará en un error. Porque solo puede haber un camino de relación entre dos tablas.