BI数据权限解决方案_第1页
BI数据权限解决方案_第2页
BI数据权限解决方案_第3页
BI数据权限解决方案_第4页
BI数据权限解决方案_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

BI数据分析是目前企业的热门应用,而对企业来说,权限控制是非常重要的,尤其是作为决策用的企业报表。目前基于微软SQLServer体系的BI架构为IntegrationServices+AnalysisService+ReportingServices,IntegrationServices和Analysis都属于应用后台的服务,不会在用户前端展现,其权限控制体系不在我们这篇文章的讨论范围内(但是实现数据级权限控制,需要AnalysisServices的参与)。而对于前端展示用的企业报表,权限控制体系分为2种:报表级权限和数据级权限。报表级权限较为简单,主要用于控制谁能够看这个报表;数据级权限则比较复杂了,任何人看同一张报表,报表上的数据只能是他有权限查看的数据。简单说,就是总经理看到的数据和经理看到的数据是不一样的,虽然他们在看同一张报表。比较报表级权限和数据级权限,会发现如果实现了数据级权限的控制,那么企业报表是否需要进行权限控制已经不再重要(当然,为了界面友好性,还是应该控制下的)。这篇文章主要就是讲述基于SQLServer架构的BI数据级权限的解决方案,这也是我给一个德国大型跨国企业客户实施其BI项目中,对方非常重视的一个功能。这里先简单介绍下这个客户和项目,出于保密要求,我把该客户叫做CustomerS(简称CS,呵呵,不是那个游戏哦)。CS项目前端采用Sharepoint,后台采用SQLServer,主要分析客户S的销售数据。CS的组织结构分为部门、区域;部门和区域是相互交叉的;某个部门的总部人员能够看到全国所有区域的数据;而区域员工则只能看到该区域的数据了。用户能够查看的数据权限,需要在网页上可以进行配置。这就是客户对数据级权限的要求。针对这些需求,数据级权限解决方案采用如下架构:报表查看流程说明:用户查看报表报表从Cube中获取数据Cube从数据库中(记录用户的数据权限配置)获得访问用户的权限配置,根据配置返回相应的数据报表显示结果数据数据权限配置流程说明:用户访问数据权限配置页面(由于基于Sharepoint,因此是内嵌数据权限Webpart的Sharepoint页面)页面获取Cube结构(由于Cube的结构内容很庞大,为了避免网页响应慢,一般通过ajax树状来展示其结构)用户修改数据权限设置,并且保存到数据库中说明:这里面进行数据权限控制的对象为域帐号(可以为域用户或者组)。纵览数据权限实现的这个流程,我们提取出中间几个重要的实现具体讲解解决方案,他们是:Cube中如何进行权限控制设置数据权限时,如何读取Cube结构Cube中如何进行权限控制SQLServerAnalysisServices本身提供了一种设置Cube数据数据权限的机制。打开AnalysisServices,我们可以看到“程序集”和“角色”2个条目,他们就是和数据权限设置紧密相关的内容了。如下图所示:-书.(MicrosoftAnalysisServer9.00.306S.00--Q罅库-jDimension5ecurity4|EJ+一J廓瘢嗯+_J薪繇吨4_J+_J麒血21鬲色,用于设闰具体嶙!l融限-_|角色您SecurityRole<1DataSecurity-I割享星WPObtiJ^LurityD_L+DataSecurity程序集:这是一个DLL类库,通过VisualStudio中新建一个ClassLibrary(类库)来实现。主要作用是返回用户能够访问的Cube数据。角色:这是访问用户的角色。在这里面可以设置角色的用户,更重要的是设置Cube调用哪个程序集来获取用户能够访问的数据。我们先来看DataSecurity.dll程序集。这个程序集的代码其实很简单,不会超过30行。其主要流程如下:1.读取访问用户的数据权限设置2.根据数据权限设置,返回一个能够访问的Dimension数据集MDX字符串我们看看如下的主要代码(这个类库也就只需要这样一个CS文件):namespaceBI(publicclassDataSecurity(publicstaticstringGetDimensionSet(stringdomain_account,stringdimension)//方法的名字无所谓,参数比较重要//domain_account:访问用户的帐号,后面我们会知道是从角色的设置中传入//dimension:是获取哪个维度的数据。在角色里,需要对每一个维度进行设置(//return"{[Location].[City].&[Seattle]}〃,返回的结果示例SqlConnectionconnection=newSqlConnection(connection_string);connection.Open();SqlCommandcommand=newSqlCommand("SP_Security_GetDimensionSetByLoginAccount”,connection);command.CommandType=System.Data.CommandType.StoredProcedure;SqlParameterpl=newSqlParameter("@domain_account",domain_account);SqlParameterp2=newSqlParameter("@dimension",dimension);command.Parameters.Add(pl);command.Parameters.Add(p2);SqlDataReaderreader=command.ExecuteReader();stringresult_set=string.Empty;intcount=0;while(reader.Read())(count++;if(result_set!=string.Empty)result_set+=",";result_set+=(string)reader["DimensionSet"];}command.Dispose();connection.Close();connection.Dispose();return"("+result_set+"}";publicDataSecurity()(}}}这个类库的作用很简单,抛开BI不谈,其实他就调用了一个存储过程,把返回结果做了一个字符串拼接,然后返回这个字符串。一般的返回结果会是大致如下:{[Location].[City].&[Seattle]},这表示用户在Location维度下只能够看到Seattle的数据,其他的城市数据都看不到。当然如果是多个城市,那就是用逗号分隔的列表,比如:{[Location].[City].&[Seattle],[Location].[City].&[Washington]}。如上所示,字符串拼接很简单,但是这些用户能够访问的具体数据记录在哪呢?这就是用户在网页上设置好数据权限,记录在数据库中的字符串了。在这里你要更清楚地话,就需要进一步了解MDX,这不在这篇文章的讨论范围之内。我们首先完成了第一步,结下来就是在角色设置里调用这个DataSecurity.dll类库了。这个比较简单,但是繁琐,对于Cube中的每一个维度都需要手动设置。这个步骤根据如下的示意图走就是了,没有什么代码工作。

■sn否席猊3卒星点愣丢歌罪原*卖濡取话廉八羔爵侦度£■£设用舟;7&SS眇鼠瞄旧©徒氐殳脉骨豪士隹I牌愕值I:汶御&炳收/扣口m淑皿■sn否席猊3卒星点愣丢歌罪原*卖濡取话廉八羔爵侦度£■£设用舟;7&SS眇鼠瞄旧©徒氐殳脉骨豪士隹I牌愕值I:汶御&炳收/扣口m淑皿ry顽典玖NAME是们词止郦诵L;雄*迎]打开SecruityRole角色的属性,进入“维度数据”中就可以设置数据权限了。每一个需要控制数据权限的维度和属性都需要设置下,基本上设置为一条语句:StrtoSet(BI.DataSecurity.GetDimensionSet(USERNAME,"City"))对这个语句解释下:StrtoSet是将字符串转换为MDX里的数据集。USERNAME是访问者的域帐号,City则为我们自定义的参数,表示要获取City属性维度的授权数据。到了这里,我们已经完成了很重要的一步,数据权限的主体已经实现了。但是对于用户来说,他需要有一个前端界面来设置这些数据权限。下面的内容就是为了解决这个问题,不过这里,我只挑出最重要的部分,读取Cube结构来讲,其他的部分你完全可以自己设计。在CS这个项目中,我们是做了如下工作:所有的设置界面都是SharepointWebpart(请参见相关内容)Webpart中的ajax(这个要单独拿出来说,是因为这个部分比较麻烦),需要用到ajax的原因就是Cube的结构是很大的,如果一次性读出来,肯定是等到花儿也谢了,相信没有人会用他。后台可以控制哪些维度需要设置数据权限(有些维度不需要设置数据权限,那么就不让他在ajax树中展示出来了)有自定义的角色,这个角色不同于刚才讲的Cube中的角色。这是用户自己定义的数据权限角色,刚才的角色只需要那一个就足够了。有了角色自然有搜索、设置用户、设置角色的数据权限、编辑、删除这个都可以根据你的需要进行设计,不一定要完全相同,就比如我用了ajax树来展示Cube结构,但是你可以采用别的方式。下面我们就进入下一个重要话题,就是读取Cube的结构(其实在读取这个结构本身,前面的数据权限就已经开始起作用了,没有权限访问的数据不会出现在ajax树中)。设置数据权限时,如何读取Cube结构读取Cube的结构,微软已经提供了一套非常丰富的类库给我们。这里就简单介绍下,如果你在具体实现过程中遇到了问题,相信上Google是一个最好的办法。下面我们介绍读取Cube结构的具体内容,首先就是连上你的Cube。这主要通过如下语句完成。AdomdConnectionadomdConnection=newAdomdConnection();adomdConnection.ConnectionString=“DataSource=localhost;Catalog=MyCube;”;adomdConnection.Open();//这里读取具体的Cube结构adomdConnection.Close();adomdConnection.Dispose();在连上Cube之后,通过adomdConnection可以读取整个Cube了。主要涉及到如下内容:Cube:CubeDefcube=adomdConnection.Cubes["MyCubeName”];Dimension:cube.Dimensions,这里面是所有的Dimension。Hierarchy:dimension.Hierarchies,所有的层次Member:hierarchy.Levels[0].GetMembers(),所有成员通过以上几个内容就可以把整个Cube

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论