如何控制SSRS报表中数据的访问权限

来源:互联网 发布:java语言与basic 编辑:程序博客网 时间:2024/06/04 18:50

如何控制SSRS报表中数据的访问权限

 

1          建立用户与维度属性值间的关系表,refAccountDim,该表存储了用户能访问的维度的属性值,也即用户权限

 

2          SSRS中建立带有账号参数的共享数据集,该数据集根据传入的账号从refAccountDim表中查询该账号的权限并返回,如区域

2.1         数据集输入参数为accountId

2.2         数据集需关联refAccountDim表,以获取用户的数据权限

2.3         输出必须是维度属性值的表达方式,如”[日期].[年份].&[2016]”

 

3          在SSRS报表中,将【2】的数据集添加到报表的数据集中

3.1         此时报表参数会自动添加accountId参数

3.2         在参数中,将accountId移动到第一个参数(因为ssrs的参数是按顺序获取的)

 

4          将【3】的数据集作为相应的参数的【可用值】和【默认值来源】,这样就实现了通过参数数据源的控制来控制对数据权限的控制

 

5          在web中使用ReportView加载SSRS报表,并向SSRS报表传递accountId参数

 

6          完成,当用户访问报表时,报表获取到用户的id,通过id查询到用户的相应维度的权限,然后通过该权限来限定用户的查询条件,通过查询条件来控制用户的数据访问权限

 

 

private void loadReport()        {            string reportName = Request["reportName"];            if (!string.IsNullOrEmpty(reportName))            {                string accountId = getAccountIdFromCookie().ToString();                //设置服务端报表的基本参数                rptView.ServerReport.ReportServerUrl = new Uri("http://192.168.10.166/ReportServer");                rptView.ServerReport.ReportPath = "/BI-BNSY-SSRS/" + reportName;                rptView.ServerReport.ReportServerCredentials = new CustomReportCredentials("administrator", "Allcity#123", "");                rptView.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;                /*                 * 此种参数传递方式会导致没有该参数的报表报错                 *                 //获取要传递的账号信息                List<ReportParameter> rps = new List<ReportParameter>() {                     new ReportParameter("accountId", accountId)                };                //设置服务端报表的参数                rptView.ServerReport.SetParameters(rps);                 */                /*                */                //获取服务端报表所需的参数                ReportParameterInfoCollection rptParamInfos = rptView.ServerReport.GetParameters();                //将用户id输入到服务端报表参数中                List<ReportParameter> rptParams = new List<ReportParameter>();                ReportParameter rptParam;                foreach (ReportParameterInfo item in rptParamInfos)                {                    if (item.Name.ToLower() == "accountid")                    {                        rptParam = new ReportParameter();                        rptParam.Name = item.Name;                        rptParam.Values.Clear();                        //当前用户                        rptParam.Values.Add(accountId);                        rptParams.Add(rptParam);                    }                }                //设置服务端报表的参数                rptView.ServerReport.SetParameters(rptParams);                //刷新报表                rptView.ServerReport.Refresh();            }        }

原创粉丝点击