如何控制SSRS报表中数据的访问权限
2017-10-16 21:07
639 查看
如何控制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();
}
}
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();
}
}
相关文章推荐
- 润乾报表v5通过权限控制数据访问方案
- 报表系统FineReport通过权限控制数据访问方案
- 在Spring中基于JDBC进行数据访问时如何控制超时
- 【Android核心基础02】 - 界面布局、测试、数据存储访问、权限控制、XML
- 基于hana的BO报表数据权限的控制方法
- ranger控制数据访问权限
- Oracle VPD实现数据细粒度访问(更好的权限控制)
- 如何在应用系统中实现数据权限的控制功能
- SpringSecurity实战! 详细讲解如何通过SpringSecurity控制用户访问权限。
- 基于C# winform企业进销存软件开发(典型权限控制+报表工具+动态加载+多线程+跨数据库访问)
- 如何在Linux下设置访问控制列表(ACL)来控制用户的权限
- 走火入魔.NET权限组件-字段访问权限(数据表字段的访问权限)思想来解决数据列的权限控制需求
- 如何使用命令行更改文件以及文件夹的访问控制权限,从而达到最高权限控制文件的目的
- 如何在应用系统中实现数据权限的控制功能
- Spring MVC控制层封装的数据在前台如何访问?
- 走火入魔.NET权限组件-字段访问权限(数据表字段的访问权限)思想来解决数据列的权限控制需求
- Apache的虚拟目录功能和如何对某一个目录进行访问权限控制
- FineReport报表软件通过权限控制数据访问方案
- SQL Server 2005:如何在多维数据集中设置访问权限
- django 如何编写控制登录和访问权限控制的中间件