Forum Discussion

GryPTonite's avatar
GryPTonite
Frequent Visitor
6 years ago

Superusuario de RLS o no

Considere un ejemplo sencillo de hojas de horas. Quiero saber si es posible implementar decir 2 reglas de negocio de seguridad:

1. El usuario que ha iniciado sesión puede ver sus propias hojas de horas

2. Un superusuario puede ver todas las hojas de horas

Supongamos que tengo 4 tablas Hojas de horas, TimesheetLines y Recursos y una tabla SuperUsers. Las hojas de horas se unen a recursos en El espacio de tiempoOwnerId y Resources tiene un identificador, un nombre y una dirección de correo electrónico que coinciden con USERPRINCIPALNAME().

Mi DAX puede ser:

Medidas:

LoggedInUser - USERPRINCIPALNAME()

LoggerInUserId á LOOKUPVALUE(Resources[ResourceId], Resources[EmailAddress], [LoggedInUser])

RLS en TimesheetLines:

NOT ISBLANK([LoggedInUser]) && (

RELATED(Timesheets[TimesheetOwnerId]) á [LoggedInUserId] //My timesheet

||

CONTAINS(SuperUsers, [ResourceId], [LoggedInUserId]) //Superusers puede ver el parte de horas de todos

)

Todo esto funciona bien. La característica que quiero es que los superusuarios resalten qué filas les pertenecen (por ejemplo, formato condicional para cambiar el color de fondo), así que en mi cabeza estoy pensando que necesito una bandera para indicar si mi propio hoja de horas verdadero/falso, pero ¿cómo implementar eso?

No puedo utilizar la función USERPRINCIPALNAME() en una columna calculada.

Traté de clonar mi tabla de hojas de horas haciendo referencia a ella y aplicando el mismo RLS DAX obviamente excluyendo superusuarios sin embargo no podía unir las 2 tablas ya que entonces el filtro se aplica en ambas direcciones, y no podía unir porque entonces no podía usar la función RELACIONADA. Así que estoy pensando que tengo que usar un método de no relación para unir de la tabla clonada a la tabla real entonces tal vez relacionado funcionaría o algo así.

Desde que escribí esto descubrí un problema similar: https://www.edureka.co/community/29920/level-security-applied-through-lookupvalue-default-filter

Pero no entendía la sugerencia en este sitio web - qué campo uso en el siguiente y cuál es mi expresión.

En mi escenario:

Measure(
    IF(ISFILTERED(<Field>),
        <expression>,
        CALCULATE(<expression>,
           FILTER(Timesheets, Timesheets[TimesheetOwnerId] á [LoggedInUserResourceId)
)
)

Otra sugerencia que tuve fue

Measure á SELECTEDVALUE(Timesheets[TimesheetOwnerId]) ? [LoggedInUserResourceId]

pero no estaba seguro de por qué funciona esto. Tal vez necesite perservidor con esto.

3 Replies