- Crear un informe principal que obtiene información de seguridad del usuario actual.
- Crear un informe secundario con los datos que realmente queremos mostrar.
- En el informe principal, comprobar si el usuario tiene permisos de lectura en la entidad y, en caso afirmativo, mostrar el informe secundario.
Para obtener los roles de seguridad del usuario actual:
<fetch> <entity name="systemuserroles"> <link-entity alias="u" from="systemuserid" name="systemuser" to="systemuserid"> <filter> <condition attribute="fullname" operator="eq" value="@CRM_FullName" /> </filter> </link-entity> <link-entity alias="r" from="roleid" name="role" to="roleid"> <attribute name="name" /> </link-entity> </entity> </fetch>
Para obtener los privilegios de lectura del usuario actual:
<fetch> <entity name="systemuserroles"> <link-entity alias="u" from="systemuserid" name="systemuser" to="systemuserid"> <filter> <condition attribute="fullname" operator="eq" value="@CRM_FullName"> </condition></filter> </link-entity> <link-entity alias="_r" from="roleid" name="role" to="roleid"> <link-entity alias="r" from="roleid" name="role" to="parentrootroleid"> <link-entity alias="rp" from="roleid" name="roleprivileges" to="roleid"> <attribute name="privilegedepthmask"> <link-entity alias="p" from="privilegeid" name="privilege" to="privilegeid"> <attribute name="name"> <filter> <condition attribute="name" operator="like" value="prvRead%"> </condition></filter> </attribute></link-entity> </attribute></link-entity> </link-entity> </link-entity> </entity> </fetch>
Una vez creado el DataSet (lo he llamdo Privileges), controlamos la visibilidad del subinforme con una expresión similar a lo siguiente:
=Lookup("prvReadaccount",Fields!p_name.Value,Fields!rp_privilegedepthmaskValue.Value,"Privileges")Que básicamente busca en el DataSet a través de la función Lookup un privilegio de nombre prvReadaccount. En el valor de esta expresión obtenemos un 1 si el privilegio es nivel usuario, un 2 si es de unidad de negocio, 4 si es "deep" y 8 si es global.