关于模块与权限的分离

第一次来到J道,感觉这里的学习气氛非常好。仔细看了以前的一些帖子,受益非浅。

小弟不才,在最近的系统开发(BS结构的)中,碰到了一个模块与权限分离的问题。

具体描述为:公司要做一个比较大的系统,现在让我来做一个框架,要求灵活性和扩展性都要好。这当然不是什么大问题,关键还是在权限的处理上。我现在希望能够把各模块相对独立开,模块中不牵涉到权限的处理,而把权限完全交给一个流程文件或一个权限类来处理。这样,如果以后权限发生变化的时候,我只需要改变一个流程文件就可以了。

想是这么想,做起来就不这么容易了。如果是一些普通的模块,如,公告管理了、审批管理了还都好说,这些模块的接口都是固定的,我只要控制好添加、修改、删除的权限就好了。可是如果碰到了那种文章管理类型的,权限是按分类来分配的,而不再是以模化为单位了。这种情况下,由于我不能直接在文章模块中写入直接判断权限的代码,而在流程中又无法获取当前文章的分类ID及用户的权限。可能我说的有些太笼统。这两天搞的我自己也有些迷糊了。

其实说到底,就是如果能在流程中很好的控制一个具有子分类权限的模块,并且不需要在模块中加入额外的权限判断代码。不知道我这样说大家是否明白。

希望能看明白的朋友给提个醒。谢谢大家

我觉得你有必要研究一下RBAC,是一个不错的模型,如果实际系统不是真的很庞大,我觉得开发一个完全分离的权限管理模块(系统)价值不算太大,毕竟SSO作为整个系统的入口对性能和设计的要求都比较高啊

但是如果系统真的有必要这样做,RBAC的确起到很好的安全管理机制,但似乎到现在为止也没有一个很成型或者说很好的现成模式可以套用,需要在standard模式下做一些实际的改动才可以。我觉得有点比较重要的是,将系统的粒度放到role上,不要牵扯上user,然后一切access control都通过role来关联和处理。

我J嘞弈K是可以a存在的,在文章模块中可以写入直接判断权限的代码

对文章权限的管理,能否通过过滤器处理?

joe说的很好。我想不要把问题想得太复杂了,KISS原则是有道理的。

在文章模块中可以写入直接判断权限的代码:
if(PrivModule.hasPrivilege(UserRuleObject,ActionObject)){
dosomething();
......
}

>权限是按分类来分配的,而不再是以模化为单位了
对于按类别分类,我目前是在两者之间插入一个树形结构,这样解耦具体应用和权限分配,但是也有不少问题,正在解决中。

mark

强烈推荐《关于用户角色权限的一点想法》http://www.csdn.net/develop/Read_Article.asp?Id=19751

根据AOP的思想,你要做的东西其实是一个“权限中间件”,它提供权限的查询服务,这样其他模块就只需要在必要的地方查询一下,而不用关心底层的权限逻辑了(不管你用RBAC还是别的什么设计)。

呵呵 这篇文章是发表在Jdon论坛的。
要做一个权限中间件,应用层面使用RBAC,技术层面使用AOP,这两者结合起来应该基本解决问题,我也在努力啊。

建议采用broker方式,实现真正的分离。make it simple, it's good

guangguang 能否详细谈谈这个broker模式如何做?提个思路?

你在理解上不是很合适,其实你应该把权限极其控制理解成一个独立的概念,那么简单地说权限控制就是:让什么对象对访问的什么目标有多大的权限。那么这个里面就有三个概念:对象、目标、多大。我们常说的对象其实就是值Role或者User,而目标呢就分为两种:数据、功能;多大其实也分为两种:广度和深度。
换句话讲,一个人对某个公司的某条数据具有某种操作权限。这个时候,人就是对象,数据就是目标,而公司以及操作就是广度和深度。
这样理解后,你就可以独立地设计出一个具有可移植的权限管理模块了。我在前年的时候就在公司做了这样的事情,当时已经实现到数据行权限(对权限的控制精确到数据行,而不仅仅是模块或者类),其实还有可能加上数据列(即不同对象看到不同的内容),只不过后来跳槽了。
好了,有什么问题,我们继续讨论。

前面谈的AOP是将来我的打算,目前我是使用J2EE容器的安全权限来实现这种分离的。

参考J2EE 1.3标准.J2EE容器的安全权限是通过JAAS实现,同时基于RBAC,也就是说,在J2EE所有配置中,都是基于角色和权限这个概念,

下面是我的ejb的权限配置,


<method-permission>
<role-name>User</role-name>
<method>
<ejb-name>MyEJB</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>

<method-permission>
<role-name>User</role-name>
<method>
<ejb-name>MyEJB2</ejb-name>
<method-name>createUser</method-name>
</method>
</method-permission>


User是一个角色名称,我现在授予User对于MyEJB所有方法都拥有访问权限,当然可以限定某个方法名称,例如第二个例子是设定User对于MyEJB2的createUser方法拥有访问权限。

这段配置相当于在代码中使用 if 权限判断,这样你的代码就实现了模块和权限的分离。当然AOP也是类似方式。

在实际情况中,EJB权限很少用,除非你提供Web Services,一般我设定Web层容器权限就可以。

具体情况在我的“Java实用系统开发指南”中有些介绍。

LDAP对于访问控制具有天生的优势,它不仅性能好,而且方便好用、跨平台,关键它还是免费的,并且有IBM这样的大头支持。
我记得当时在HP(惠普)干的时候,其中的一个大项目就是用这项技术的,它可以控制的很细,并且扩展性好的简直到目前为此没有比它更强的了,你可以不断的加入新用户,分配其应有的权限。
哈哈,这个LDAP优美得太可以了。要是与Java的JNDI配合那就是绝配了!!!:)

――没有做不到的,只有你没有努力去的――

好的权限系统是3维的,
用户、数据、功能
简单说就是who,what,how的问题。

可以把情况分为两级:
一:功能-用户,比如
用户管理-张三
系统管理-李四


二:数据-功能-用户,比如
文章审核-J2EE版块文章-王五
文章删除-J2EE版块文章-赵六

实现权限系统时主要是把握粒度问题,用户方面粒度好办,都是把用户映射到组。功能方面也好办,可以把功能映射成角色。最难办的就是数据的粒度,大到一个很大版块做为一个单位,小到每条记录甚至是到一个字段才作为一个单位。所以,还是具体问题具体分析吧。