- 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.