反馈已提交

网络繁忙

外部权限表实现数据权限过滤

  • 文档创建者:happy_cangcang
  • 历史版本:4
  • 最近更新:happy_cangcang 于 2020-05-15
  • 1. 概述

    1.1 应用场景

    同一张报表,不同的用户登录,看到的数据不同。

    例如:北京分公司的人只能看到北京的数据,上海分公司的人只能看到上海的数据。

    1.2 实现思路

    引入外部权限表,直接在数据库查询语句中实现数据权限的过滤。

    2. 简单权限示例

    2.1 了解$fine_username

    $fine_username:该参数用于获取决策系统的登录名。详细内容参见:权限细粒度之参数控制

    2.2 创建外部权限表

    在数据库中创建一张外部权限表。表中的 user_code 对应的就是决策系统的用户名,比如:zhangsan 就是用户名。

    注:如果之前已经有用户和城市的对应表,就不需要创建这张对应表了。

    图片.png

    2.3 在设计器中引用外部权限表

    在 FineReport 设计器中引用2.2中创建的外部权限表,把过滤条件写在数据源代码里。数据过滤分以下两种情况:

    1)如果所有用户都要过滤权限,就比较简单,可以直接写在条件里。

    注:以下代码以MySql数据库为例:

    图片.png

    2)如果有的用户不需要过滤权限,有的用户需要过滤权限,就需要判断一下。

    注:以下代码以MySql数据库为例:

    图片.png

    注:以下代码以SQL Server 2014数据库为例:

    图片.png

    3)报表完成后,部署到决策平台,用 zhangsan 这个账号登录,就只能看到北京市的数据。用 lisi 登录,就只能看到上海市的数据。

    3. 多级权限示例

    3.1 多级用户外部权限表

           通常情况下,查看报表的用户不止一种级别,可能会存在多种级别,如:省公司用户、分公司用户、业务员等。这个时候就需要调整一下外部权限表,增加一些字段来区分不同的用户。

    下图所示的是经过调整的外部权限表fr_user_city的字段及内容,可以控制多级用户权限:

            张三是1级用户,拥有江苏省公司的权限;

            李四是2级用户,拥有3个分公司的权限;

            管云云是3级用户,除了查看自己的业绩,还可以查看其他人的业绩;

            王锐也是3级用户,只能查看自己的业绩。

    图片.png


    3.2在设计器中引用多级用户外部权限表

    注:以下代码以MySql数据库为例:

    SELECT t.prov_name AS '一级机构',
          t.city_name AS '二级机构',
          t.sales_name AS '业务员',
          t.int_value AS '数量'
    FROM yl_order_table t
    WHERE 1 = 1
    -- (1)过滤 1级部门
     AND CASE WHEN (SELECT COUNT(1)
                      FROM fr_user_city t
                     WHERE t.valid = 'T'
                       AND t.level IN (1,2,3)   -- 注意:过滤不同级别权限时此处不同
                       AND t.user_code = '${fine_username}'
                    )<>0
              THEN t.prov_name IN
                   (SELECT distinct t.org1_name -- 注意:过滤不同级别权限时此处不同
                      FROM fr_user_city t
                     WHERE t.valid = 'T'
                       AND t.level IN (1,2,3)   -- 注意:过滤不同级别权限时此处不同
                       AND t.user_code = '${fine_username}'
                    )
              ELSE 1=1
         END
     -- (2)过滤 2级部门
     AND CASE WHEN (SELECT COUNT(1)
                      FROM fr_user_city t
                     WHERE t.valid = 'T'
                       AND t.level IN (2,3)      -- 注意:过滤不同级别权限时此处不同
                       AND t.user_code = '${fine_username}'
                    )<>0
              THEN t.city_name IN
                   (SELECT distinct t.org2_name  -- 注意:过滤不同级别权限时此处不同
                      FROM fr_user_city t
                     WHERE t.valid = 'T'
                       AND t.level IN (2,3)      -- 注意:过滤不同级别权限时此处不同
                       AND t.user_code = '${fine_username}'
                    )
              ELSE 1=1
         END
     -- (3)过滤 3级部门
     AND CASE WHEN (SELECT COUNT(1)
                      FROM fr_user_city t
                     WHERE t.valid = 'T'
                       AND t.level = 3           -- 注意:过滤不同级别权限时此处不同
                       AND t.user_code = '${fine_username}'
                    )<>0
              THEN t.sales_name IN
                   (SELECT distinct t.org3_name  -- 注意:过滤不同级别权限时此处不同
                      FROM fr_user_city t
                     WHERE t.valid = 'T'
                       AND t.level = 3           -- 注意:过滤不同级别权限时此处不同
                       AND t.user_code = '${fine_username}'
                    )
              ELSE 1=1
         END
    ;


    4. 注意事项

    不同的数据库会有一定的差异,请根据实际情况进行调整。


    附件列表


    主题: 数据决策系统
    已经是第一篇
    已经是最后一篇
    • 有帮助
    • 没帮助
    • 只是浏览
    中文(简体)

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭



    AI

    联系我们
    在线支持
    获取专业技术支持,快速帮助您解决问题
    工作日9:00-12:00,13:30-17:30在线
    页面反馈
    针对当前网页的建议、问题反馈
    售前咨询
    采购需求/获取报价/预约演示
    或拨打: 400-811-8890 转1
    qr
    热线电话
    咨询/故障救援热线:400-811-8890转2
    总裁办24H投诉:17312781526
    提交页面反馈
    仅适用于当前网页的意见收集,帆软产品问题请在 问答板块提问前往服务平台 获取技术支持