Monday, April 02, 2007

数据权限设计思考

目前有关用户权限采用的比较多的都是基于RBAC模型,即通过对角色权限的定义完成对用户权限的限制。有关功能权限部分想必都比较清楚,就是将系统的功能模块划分清楚,并赋予不同角色的访问权限,这样在用户访问某个功能模块之前进行权限校验即可。但是有关数据权限部分却一直比较模糊。

在如下这篇文章中给出一个权限模型,里面提到了数据权限的建模。
http://blog.csdn.net/fly_cloud/archive/2006/08/09/1041807.aspx
这个模型中有关数据权限也是对角色进行权限限定。模型中定义了几个概念:
资源:用户将要访问的数据对象(如用户)
数据对象类型:对用户将要访问的数据对象的限定类型(如部门)
资源数据对象类型:上面两个概念关联产生的,即用户要访问什么类型的数据对象(如××部门的用户,但是此时的××是通用的,只有将数据对象类型具体化之后××才会出现)。

将上面的资源数据对象类型实例化(即××具体化)之后就形成了一条数据对象访问规则,将这条规则附加给某个角色就完成了对角色数据访问权限的限定。这个模型定义是很清楚的,但是如何具体实现,其实是一个比较复杂的问题。

一个比较直观的想法就是在业务层之上加一个数据权限校验层。

上面定义的数据对象类型其实就是用户访问的数据对象的属性,因此在校验的时候确定相关数据对象的属性是否满足用户数据权限规则即可,对于增删改就是操作之前校验,对于查询就需要对查询结果过滤。当然为了整个实现的简单需要确保系统中的所有数据对象Class都是从一个Class中继承而来限制是。这一想法实现起来比较简单,但是有一个限制和一个性能忧虑。限制就是为了保证规则校验的进行,必须使得所有数据对象都应当具有权限规则定义的相应属性,如果规则定义的属性发生变化,势必需要所有数据对象的生成方法发生变化。性能忧虑就是对查询结果的过滤,其实在一般的MIS系统中多数情况是进行查询,但是如果依照这种方法进行结果过滤的话,可能会存在性能的问题。

因此,这一想法具有紧耦合和性能问题。

另外一个想法依然无法避免紧耦合,但是可以避免性能问题。然而在逻辑上就没有上面那个直观了。这一想法就是将数据权限规则转成SQL语句,嵌入到数据访问层中去。

因为资源必定会对应到某一个数据表,而数据对象类型也会对应的到某个数据表的某个属性列,因此完全可以依据数据权限规则动态生成SQL语句。数据权限规则可以如下定义:【资源数据对象类型 关系符 右值】,右值可以分为静态和动态两种:静态就是一个具体的值;动态就是用户的某个属性,这只有在与用户关联上之后才能确定。但是由于一个角色可以有多条数据权限规则,那么他们之后可以是与和或的关系,多个规则之间可能存在冲突,必须进行避免,如:当规则之间是与关系时,如果资源数据对象类型和关系符都相同时,就有可能冲突。具体的说就是要限制角色R只能访问A部门的用户且只能访问B部门的用户,这样子势必是相互冲突的。

在数据访问层调用一个统一的SQL生成方法,传入两个参数:不加限定是要访问的数据表名和角色数据权限规则集(此时的规则集中应当已经具有准确的右值,即如果是动态的也已经根据用户属性赋值了)。方法是:依次判断规则集中的规则是否有要访问的数据表名,如果有就生成SQL语句的FROM子句和WHERE子句,最终语句规则集关系符(AND | OR)生成FROM子句和WHERE子句返回。
数据访问层获得权限校验产生的FROM子句和WHERE子句嵌入到数据访问方法中去,这样就将数据访问和权限校验结合在一起了。明显是紧耦合,但是规避了性能问题。

因此,上面两个想法各有个的优势,但是同样都有一定的问题,是不是有更好的办法?继续思考中……

WSRP探秘

这周除了继续思考数据权限模型的建模和实现以外,主要还研究了一下WSRP(Web Service for Remote Portlet)。这个技术主要是采用WebService方法整合其他应用中的远程portlet到自己的Portal应用中去。
首先需要有一个Producer,即提供服务的出处,它分为两种:Simple Producer和Complex Producer,一般的采用Workshop创建Portal项目都是Complex的,而一般的Web Project即只采用Struts或者PageFlow的都是Simple的,其实生成Producer的过程很简单,如果是采用Workshop,则有很简单的菜单,当然即使不是采用Workshop,也就是拷贝几个Jar和生成几个XML文件。但是不管怎么样,都有一个问题就是这个Producer一定要运行在Portal Domain上,否则无法发现这个Producer中的服务(后面会提如何发现)。
接着就是应用Remote Portlet的Consumer。这一步操作也很简单,就是在创建portlet的时候选择类型remote portlet,然后输入producer的WSDL,一般是“[WEB_ERL]/producer?WSDL”,然后点击Retrive就可以发现Producer中的portlet了,之后选择一个portlet就可以创建成功了。
运行门户测试之后发现有两个问题:
1.URL问题,就是原来producer中的URL如果没有采用portal的URL tag或者应用生成URL的话,那么这个URL在consumer中应用就会出现连接错误,比较明显的就是一些图片无法显示。
2.用户身份问题,如果producer中需要用户身份,如果不设置CA和SSO,那么producer无法获取consumer中已经登录的用户。

这两个问题是致命性问题,涉及到对原来应用的修改和需要部署SSO,除此之外,加上需要producer部署在Portal Domain这一限制,当然还有producer和Consumer的风格差异问题,使得WSRP这一技术在当前工作中的应用,看来目前尚存在较大的困难。

《门徒》观感

昨天晚上看了电影《门徒》,很是震撼呢。整个故事据说都是原来发生在香港的一个过案,而展现在我们面前的却是涉毒的罪与罚。那种罪是一种非常令人揪心的罪,它将一个美好的事物活生生的在你的面前毁坏,你却无能为力。
在里面张静初演的阿芬是一个多么漂亮的女孩子,似乎看起来也很善良,可是吸毒之后的恐怖与言而无信,让人不免有些心痛,一个人就这么毁了,而相应的罚却由她一个人承担。还有古天乐演的她的老公,吸毒之后竟然变的这么龌龊和无耻,竟然让自己的老婆去卖,还将自己染毒的责任推到自己的老婆身上——当然了,她老婆也说自己染毒是他的原因,但是他们的话或许都已经不可信了。
然而这一切是谁的责任?是他们自己,是这个社会,还是那些制毒和贩毒者?贩毒庄家昆哥说这都是吸毒者自己的错,他甚至说“我们是作生意的,讲的是供求,有人吸,当然我们就要卖了”。看来,他虽然没有吸毒,但是人性的晦暗也已经差不多了。
片子的开头和结束都说“人为什么吸毒?或许是因为空虚。但是什么更可怕,是毒品还是空虚”。最后的一个镜头,吴彦祖演的阿力,这个警察卧底——他已经没有鸽子可喂了,面前摆放了那一堆“器材”,关键是他还点燃了那一支蜡烛。我想可能他也空虚了,他也想实验一下哪者更可怕。可爱的是这个时候那个小女孩进来了,将那堆器材给扔到了垃圾桶里。或许是这个可爱的小女孩驱走了他的空虚。
涉毒的罪与罚,罪不知是谁的罪,而罚却是极致的。

辛苦的回京路

每年春节回家,都是回家容易返京难,今年的返京之难达到了顶峰。
原本在回家之前就跟小詹说好了,要她找朋友搞定从长沙回京的票,说的是初六的。可怜的是初三还说已经到手了,可是到了初四却说出了点问题,于是乎我就四处找人。本来也做好了推迟几天回单位的打算了,可是后来找到大哥说他可以帮忙搞定初七的票,而且当时的态度很坚定,说他的朋友答应留一个铺位,然后送我上车就行了。因此我接着就预定了从县城到长沙的汽车票,初六到到了县城,在表姐家住了一夜,初期早上就坐汽车出发了,沿着京珠高速到了长沙。当时在汽车上看着窗外的风景,心里还在想要是沿着京珠高速回京会是怎么样呢,没有想到几个小时之后倒成了真的了。
到了长沙之后才发现大哥的那个朋友忽然联系不上了,而大哥也要赶晚上11点从株洲出发的火车,不得已之下只得购买了一张从长沙到北京的大巴高价票,而且这不是长途客运站发的,是一个旅行社的,要知道那时候初十之前连飞机票的没有了,更别说汽车票了。
后来由旅行社的人带着去等车,大哥也回株洲了。到了等车地点才发现被忽悠了,原来买票的时候(4点左右)说6点发车,可是据说之前12点左右打电话给司机问的时候,他却在1000公里之外,也就是说至少要到晚上10点以后。大哥已经回株洲了,我短信告诉他情况之后,他又接着联系他的朋友。后来到了晚上8点左右,大哥电话跟我说要我把汽车票退了,然后去火车站的什么什么地方进去。退票之后我四处找人问知不知道火车站的那个什么什么地方,最后终于问道一个摩的司机知道。到了那之后才发现不是那么简单,挤满了人,门口有武警把守,除了有证件的车让进以外就是单个的人了,之后发现背了行李就给推了出来,几次我想蒙混过关都不成。而我要上的那趟车是9点10分左右发车,8点45了我还没有进去,更不知道进去之后该怎么走了,当时那个急呀。不过也没有办法,看来是搞不定了,都已经作好了在长沙留宿一夜的打算了。
接着我又回到了那个旅行社,忽然听说去北京的车来了,赶紧又买了票跑去原来等车的地方。这才发现是误传,不过也没辙了,等着吧。一直到了10:30以后 才来了一辆车,然后临时决定发往北京,这样子我终于坐上了前往北京的车。
客车晚上11点才发车,一路颠簸,先是走的京珠高速,过了武汉之后又折走国道(更慢了),因为武汉至郑州段封了,然后第二天上午10点多才返回走高速。于是我一路看高速上的指示,然后计算到北京还要多少时间。最后是到了晚上9点才到北京下车,我打的到学校宿舍放下行李是9:30,然后赶紧抓紧时间去洗了个澡,我这个澡洗的之神速以致于澡堂师傅都说“这么快”!
唉,终于算是到了,当天太迟了没有打电话回家了,知道第二天才电话回家报平安。这次真是辛苦,不过也还是要感谢那些为我忙活的亲戚朋友们。

《黄金甲》观感

昨晚看了传说已久的《满城尽带黄金甲》,应该说总体来说还是不错的,毕竟有曹禺先生的作品打底,故事还是讲清楚了,而张艺谋又还是非常擅长于制造那种视觉冲撞。
但是不知道怎么回事儿,将曹老先生写的这个《雷雨》的故事放到一个古代宫廷里去,总是显得有些别扭,或许给老外看看还是不错,但是我的看法是:多了些爱恨情仇,少了点家国天下。

BEA World 2006

去年就参加了BEA World 2005,今年的12.13-12.14的BEA World 2006大会我们也参加了。
第一天的主题演讲由于我们迟到了一些所以没有听全,其中第一个是BEA董事长庄思浩的,它阐述了MSA的概念,即microService Architecture,之后就是几个合作伙伴或者客户的主题演讲,其中有一个Intel公司的Enterprise 2.0的概念倒是挺有意思的。
下午是分会场的技术专题,我主要听了两个,一个是关于WebLogic Portal 9.2。这里阐述了Portal的益处,在SOA架构的具体体现和9.2的一些新的功能,但是之后我与他的交流得知Workshop 9.2的性能问题的确是个问题,他也要我具体向Workshop组咨询,而如果我想用9.2中的mail portlet的话,就必须将我们现在8.1上开发的Portal升级到9.2。第二个技术专题是有关BPM的,我不懂行,没有怎么听明白。
之后就是我们北京大学和BEA的一个交流会了,会上我们详细了解了BEA新出的AquaLogic系列产品,尤其是DSP(Data Service Platform),它支持多个数据源的读和写,其中针对顶层用户来说,数据的访问只是一个Service,而所有底层的工作都交给DSP,当然了之后由于时间的问题还有一些具体问题没有讨论了,例如再做多个数据源的Virtual Model的时候是否可以加入一些个性化的东西,等等。与DSP一起发布的还有Service BUS,Service Repository,Service Registry 等等,这些都是这次BEA World向大家展示的它对SOA的理解和实现。
第二天上午按照安排也是主题演讲,我们没有过去,只是听了下午的几个技术专题,挺不错的。
第一个是Pieter Humphery和另外一个BEA客户一起的有关BEA WebLogic 9.2如何帮助客户实现无缝创新(Seamless Innovation)的问题。介绍了WebLogic在集成原来遗留系统和创新发布新服务上的功用,其中提到了几个原则,例如代码编写应采用标准访问机制,提供描述清晰的接口;尽量限制BEA Control的使用。其实这都是我们应当注意的,因为用了太多的BEA Control会导致迁移到其他非WebLogic服务器上的问题,而目前WebLogic也很关注与其他开源项目的集成,最新退出的9.2就是一个体现。
第二个是有关AJAX技术的,这个一个客户端异步技术。目前我们想更新页面中的部分内容是都需要更新整个页面,采用AJAX技术之后可以只是更新那部分内容,而不会更新整个页面,这样可以提高效率。但是这种操作方法是建立在比较复杂的客户端页面编辑上的,AJAX是采用javascript实现的,避免不了复杂的页面编辑。而workshop 9.2集成了AJAX技术,并且能够适当的帮助降低采用AJAX之后的复杂性问题。
第三个是混合应用开发,也是Pieter Humphery的,其实主要是介绍 BEA Workshop 9.2,介绍了它如何在Eclipse基础上集成BEA workshop的原有功能和目前的一些开元项目,如Struts,Hibernate, Beehive等等。在之后的Q&A过程中,Pieter强调了与在Eclipse上做集成是BEA IDE将来确定的发展方向。可是他那个笔记本上运行Workshop 9.2好快呀。
最后一个是中文的,也是前一天与BEA交流会上他们向我们推荐的,有关Information Service Bus。这其实也是一个对AquaLogic系列产品的介绍,阐述了Data Service, Service Bus, Information Service Bus等概念,以及AquaLogic系列产品如何实现这些概念的,尤其介绍了DSP。看来有关这个东西我们需要继续跟进。
去年的BEA World我的感觉是在宣传SOA,而这次就是在具体推广和展示了。还有一点收获,有必要大力提高自己的英语听说能力。

从绍兴到奉化

杭州会议的议程安排只是到周四,周五开始我们一行人等便自己组织出去游玩了,这一天的安排首先是绍兴的鲁迅故居,然后才是奉化的蒋氏故居。

整个鲁迅故居景点在一个典型的江南小巷两旁,包括鲁迅故居、鲁迅祖居、三味书屋和百草园等。小巷的路面已经见不到当年的石板路了,不过旁边还有一条小溪流过,小溪上好些绍兴古时典型的交通工具——乌篷船。祖居很是开阔,整体色调是黑白——这当然和当时的封建礼制有关。不过煞是有趣的是,进得祖居厅堂之后,回头望进门屋顶,可以明显的见得一个官貌样式的屋顶雕饰,这可以见得鲁迅祖父对仕途的强烈渴望。整个祖居内古朴而豪华,说它古朴是因为它具有很好的那个年代的江南风韵,说它豪华是因为在那个时候这的确算得上是一处豪宅了,雕花的家具和窗饰,各处雕饰都显出了房屋主人的品位和富庶。

走出祖居,走过小溪,我们来到对面的寿镜吾老先生的宅子——三味书屋。鲁迅认为寿老先生是“极方正、质朴、博学的人”,他的宅子也是很古朴的,虽然在豪华程度上及不上鲁迅祖居(毕竟当时鲁迅祖父一家也是相当的富庶之家)。三味书屋相当的体现了这一个古朴的风格,一个不大的厅堂,正中悬挂一幅松鹤延年,然后四处摆着五六张书桌,据说当年这些书桌都是学生自己带来的,由书桌就可以看出各家的家境如何。从书桌的数量可以看出当年寿老先生也就带这么些学生,如此倾心教育,质量当然高了。三味书屋的后头是一个分外雅致的小院,圆形的院门,里面栽有两棵不大的小树,当时枝叶繁茂,秋日的阳光照射下来,一片斑驳。

故居的格局跟祖居差不多,倒是后面的那个百草园别有一番趣味,这个可是当年儿童鲁迅的乐园。“碧绿的菜畦,高大的皂荚树”,这个只是一个简单的菜园子,在当时的鲁迅来看,不知道拥有了多少的快乐时光。当时还是个小少爷的鲁迅可能还想不到当时自己家境的艰难,很快故居连同这个园子都要典卖给人家,而也正是由于典卖了出去,使得这个园子在鲁迅的心中更是显得尤其珍贵。其实这样的菜园子在现在农村看来很是寻常,然而当时可要是地主才能有的,而且跟这一片古朴而豪华的大宅子在一起就更不简单了,它不仅仅只是菜园子,除了种菜以外,还可以栽点花花草草,因此也就成了闻名天下的“百草园”。

下午我们驱车前往奉化溪口,在这里主要游览了两个地方,一个是雪窦山的妙高台,一个是蒋氏故居。

雪窦山的妙高台其实是蒋氏当年回家避暑的一个去处,这个地方建有一栋阁楼,中西合璧。钢精水泥,木板阁楼,显得不是很纯粹,少了那份古朴。阁楼上悬有一匾额,上有中正手书“妙高台”。阁楼所建之处,三面悬崖,云雾袅绕,故称之为“妙高台”。阁楼旁边有个亭子,这个亭子在《开国大典》中曾经出现过,就是那个蒋介石与孙子下棋的亭子,故俗称为“棋亭”。站在亭中,视野开阔,心中别有一番感觉,是个不错的去处。

从妙高台下来,我们来到了蒋氏故居。故居前面是一条河,怪不得电影中每每说到蒋介石回家时就经常会有一条河的镜头,不过河的名字我已忘了。蒋氏故居里面的建筑我倒没有看出什么好了,与妙高台的感觉一样,钢筋水泥加木板阁楼,虽然中西合璧,但是显得不纯粹,这也可能是文化冲撞初期的通病吧。不过从建筑格局中可以看出蒋介石对母亲是及其尊敬和孝顺的,如蒋母阁楼基座的抬高(虽然有这个是祖宅的原因)和单人可行楼梯的设置。从故居出来我们还去看了一下“文昌阁”,这是当年宋美龄的住处,因为她不想与蒋的第一人夫人在同一屋檐下。文昌阁距离蒋氏故居不远,在河岸边一个突出的高台之上,原来是一个文人雅客聚会的地方,后来荒芜了,于是蒋出资重建了这样一座阁楼,但远没有原来的古味了,加入了太多的钢筋水泥的味道。其实我想这阁楼后来或许还被毁过吧,我们现在看到的不知道又是什么时候修建的了。

从文昌阁出来已经快6:00了,天色也暗了下了,我们驱车前往宁波,准备拜访“海天佛国”——普陀山。

西湖之行

这次有机会赴杭州开会,我们提前一天就到了。那天下火车到酒店报到住下才10点多,于是我们就琢磨着出去逛逛。

来到杭州当然要去西湖了,坐着公共汽车,我们来到西湖边上的南湖口下车。这里的一片水面并不是很宽广,远望过去就是雷峰塔了,塔顶据说是涂了金的,当日那时还略有些阳光,因此显的金光耀眼。再往近点就是苏堤了,我们一行人等决定从苏堤逛起。

苏堤口立有苏东坡的一座雕像,因为这是当初苏东坡任杭州知州时建的一道湖堤。我当时还问这道湖堤到底有什么实际功用,同行的老师说可能只是用于赏景的吧,我想东坡先生毕竟是一个文人呀。苏堤口另外还立有一碑,是沙孟海先生写的“苏堤”二字,沙老先生是有名的书家了,我在那照了一张像。后来我发现浙江很多名胜都有沙老的题字,难道沙老与浙江有什么特殊的渊源,还真是不清楚。

登上苏堤,挺开阔的一条柏油路,两边是草地和郁郁葱葱的乔木,那些树木除了法国梧桐和垂柳之外我就不知道其他的名字了,再往外就是湖水了。我们去的时候已近初冬,但四处仍然弥漫着勃勃生机。要是初春之时这里的风景必然更是迷人,“苏堤春晓”之景不知道要迷煞多少人,真的是“暖风熏的游人醉,直把杭州作汴州”。苏堤上有六桥,顺序不清楚,但名字还是记得的,映波、锁澜、压堤、望山、东浦、跨虹。压堤桥上观景最佳,两边都水面开阔,可尽揽西湖美景。一边可远望孤山,一边还可近看“三潭印月”,同时亦可仰承雷峰塔的金光。

走下苏堤,我们就往白堤方向走去,但是没走多久,大家又想去湖中的三潭印月上看看,于是我们坐着那种无舵摇船前往湖中各个景点。泛舟西湖也是别有一番韵味啊,遥想当年西子与范蠡,想想如今我们船上要是有幽幽琴声相伴,另外再奉上一杯清茗,那该是多好的西湖之韵呀。可怪的是船老大尽跟我们讲些俗不可耐的事儿,不过也不能都怪人家,哪时不是俗人一大把,自己还不经常是俗人一个。三潭印月的实景其实不在湖中那个岛上,而是岛的旁边,不过恰好可在岛上观景罢了。那是三座类似佛塔的小塔立于湖中,据说在八月中秋之际,三塔之间的湖面上可见三个月影,不知道这是一个什么样的光学现象。我们还就此问船老大了,他说其实没有,都是人做出来的,哈哈。在湖中岛上的“我心相印”亭上观三潭印月是最佳的,此亭一边是粉墙,一边是走廊,显得很是别致。“我心相印”是一佛语,俗人我在此不敢妄谈。船老大跟我们说,湖是天然湖,岛是人工岛。三潭印月算是最大的一个岛了,整个岛并不都是陆地,只是围了起来。岛上建亭榭走廊,直堤曲桥,从空中看该岛酷似一“田”字。岛上曲桥还是清雍正时李卫所建,岛上还有一个“三潭印月”碑,像是康熙御笔,碑是在一个亭子之中的,亭上的篆体楹联颇有意思,“潭月澄心印,湖光豁性灵”,但不知何人手笔。

从岛上下来上船,此时天已经下起了一些小雨,船老大将我们送到了“中山公园”码头上岸。幸好雨也小的很,我们一行人等向白堤走去。途中路过了“平湖秋月”亭,这是一个平台。据我们一个老师讲他有一次晚上来,正巧湖中有表演,而他们就在这个平台上品茶观赏,想想就觉得很是不错。过了平湖秋月很快就到了白堤,白堤的一旁是西湖,一旁那个湖就记不清叫什么名字了,好像是西里湖。湖中种了一片荷花,当然此时没有花了,有的只是一片残枝败叶,这使我想起了《红楼梦》中黛玉与湘云的两句和诗,“寒塘渡鹤影,冷月葬花魂”。唉,想这些冷郁的词作甚。

白堤或许是由于两旁的树木少些吧,显得比苏堤宽阔些,而且上面现代化的作用太过明显。白堤上有两座几乎一摸一样的桥,锦带桥和断桥。我们是先上了锦带桥的,没有做什么停留就直奔断桥,因为断桥可是久负盛名呀。杭州三怪:孤山不孤,长堤不长,断桥不断;断桥残雪更是西湖一景,何况断桥上还有许仙和白娘子的传说。登上断桥,结果发现这桥居然和前面的那座一样,不知道原来就是这样还是后世的人工所作。不管怎么说,我也算是见到了这传说中的断桥,遂照相留念。断桥的那头有一碑亭,好像也是康熙御笔,“断桥残雪”。

这一路走来,时间已经到了4点多,我已经尽兴了,大家都有些累了,于是坐车返回酒店。不过还有好些景致没有观赏,比如“曲院风荷”,比如杨公堤,留待将来有机会再来吧。