历史版本21 :权限细粒度参数控制 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 版本编辑

报表服务器版本
10.0

2. 描述编辑

希望不同用户登陆系统后,访问相同的模板,所看到的数据是不同,样式不同等。如:访问报表 A,中央的账号登陆系统,看到的是全国的数据,而省级用户登陆系统,看到的是该省的数据,依次往下类推。

3. 实现原理编辑

用户认证后会将报表三个固定的默认参数$fine_username$fine_role$fine_position保存在 Session 中。

同时提供两个函数GETUSERDEPARTMENTS()GETUSERJOBTITLES()来分别获取部门角色的部门和职位。

同一报表环境下,模板中就可以直接以参数的形式获取到对应的值,然后在模板里面进行筛选判断就可以显示不同数据及样式。

3.1 $fine_username

获取登录系统的用户名。

比如说登录用户名为 Anna,那么$fine_username=Anna

3.2 $fine_role

获取登录系统的角色。

如果是管理员用户登录,则$fine_role=SUPERROLE

如果是角色用户登录,比如说角色「数据架构师」用户登录,$fine_role=数据架构师

如果是部门角色登录,该参数为空,$fine_role 返回值为数组,使用concatenate($fine_role,"")即可将其转化为字符串。

3.3 $fine_position

获取部门职位,返回值为一个由部门和职位组成的数组。

比如「人力资源部长」职位登录系统,那么$fine_position={"departments":"人力资源","jobTitle":"部长"}

3.4 GETUSERDEPARTMENTS()

获取部门职位里面的部门。

比如说「人力资源部长」职位登录系统,那么GETUSERDEPARTMENTS()=人力资源

若多个部门,则数组GETUSERDEPARTMENTS(3,2)返回角色该部门的第三层和第二层名字。若多个部门则返回数组,若没有第三层则只显示第二层。

3.5 GETUSERJOBTITLES()

获取部门职位里面的职位。

比如说「人力资源部长」职位登录系统,那么 GETUSERJOBTITLES()=部长

注:$fine_username、$fine_role、$fine_position 是我们报表默认的参数,所以调用时大小写必须保持一致。

注:$fine_username、$fine_role、$fine_position 参数在 9.0 里分别对应 $fr_username、$fr_authority、$fr_userposition。

4. $fine_username编辑

不同用户登录查看的数据是不同的。下文在数据集中通过报表默认参数$fine_username进行过滤筛选,在 SQL 中加入过滤筛选语句,即可达到不同的人看不一样的数据。

4.1 示例一

用户王伟登陆成功之后只能看到自己的销量,定义的数据集为 ds1:SELECT * FROM 销量 where 英文简称='${fine_username}'

配置好权限以王伟登陆成功之后,模板内容就会自动筛选到王伟的信息了, 以其他用户登陆进去则可以看到其他用户的信息。
222

4.2 示例二

在参数界面,控件的值根据权限参数值的改变而显示的值不同,这样通过动态 SQL 获取,增加 SQL 的过滤条件为权限参数名称即可。

用户王伟登陆成功,看到的下拉框控件只有自己的产品,

在设置下拉框控件,选择动态 SQL 输入 SQL 语句为:SELECT * FROM 销量 where 英文简称='${fine_username}'选择实际值和显示值。

这样就实现不同的用户,登陆系统进入报表,下拉框所看到值就不同了。
222

注:参数界面必须定义控件,参数名为报表默认参数 fine_username,因为参数界面传值是通过控件的值来引用的,所以先定义控件才可以把值传到控件 chanpin 里面,进行筛选数据。如果控件 fine_username 不希望显示,可以在控件设置,可见的勾去掉即可。

5. $fine_role编辑

希望不同角色看到的列数不同,行列的颜色不同,这样可以给行列添加条件属性设置行高、列宽、背景等,如果登录系统用户为角色用户,则可以在公式中通过$fine_role进行过滤,如果是部门职位用户,则不可使用该参数进行过滤。设置模板的条件属性格式可参考 条件属性 文档。

若王伟是管理员,孙林的角色名称是销售主管,且为导入的角色或者手动添加的角色,王伟登录的时候可以看到所有的列,而孙林登录的时候只显示地区、销售员、产品和销量,汇总这列看不到。这里就得在汇总这列添加条件属性>列宽,设置为 0 。

公式中写入默认参数$fine_role='销售主管'判断登录的角色为销售主管,如下图所示:

222
注:如有一个用户有多个角色的情况,可将公式改为:find('销售主管',$fine_role)>0

以孙林登陆成功后,即角色为销售主管登录,访问模板只能看到报表展示了以下内容,如下图所示:
222

6. 两个函数编辑

仍然以上面的$fine_role示例中的模板为例,只是此时孙林不再是角色用户,而是部门职位用户,部门为销售部,职位为 sale,那么公式中应该写入两个函数GETUSERDEPARTMENTS()='销售部'GETUSERJOBTITLES()='sale',如下图:

222