论坛首页 Java企业应用论坛

关于权限模块设计的一点思考

浏览 34168 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2008-10-31  
hi all: 看见大家提出了很多技术上的解决办法,呵呵,实在忍不住想说两句。我在公司就是维护权限系统的。我个人认为,权限系统控制到url这个粒度就可以了。再往下控制可以交给其它系统来解决。
    你能做到多细了?你可以控制按钮,那你需不需要控制链接了?如果不同的角色,看到的下拉列表框不同,你需要控制吗?如果不同的角色需要看到的列表数据也不同,你需不需要控制了?业务需求是多变的,你能满足多少了?再则,你花费80%的精力去提供10%的功能是否值得?
   
   
0 请登录后投票
   发表时间:2008-10-31  
ACL不就可以了,jdk自带的ACL就很好啊。基本能满足所有的需要
0 请登录后投票
   发表时间:2008-11-01  

有没有哪位做过如下控制?

一、某个岗位的人能看1天的数据,另外一个岗位可以看一个月数据。

二、某个岗位不能看某列的数据,而其他的岗位可以看。

有什么好的解决方案?
0 请登录后投票
   发表时间:2008-11-01  
zhajie 写道

有没有哪位做过如下控制?

一、某个岗位的人能看1天的数据,另外一个岗位可以看一个月数据。

二、某个岗位不能看某列的数据,而其他的岗位可以看。

有什么好的解决方案?

这已经是业务了
如果通过报表来展示数据,倒是可以把报表作为授权的对象
0 请登录后投票
   发表时间:2008-11-01  
jander 写道
有这么复杂吗?
简单的权限用RBAC解决。复杂的用ACL解决。
应该是现在的标准吧。
这两个决定了谁有权限,然后用filter(web),aop(Class method)两头一截。ok。

那你是怎么让filter过滤的url和aop拦截的类的方法名做到对应的?专门建表维护这个关系?
比如 "user.do?do=delUser&userid=23" 这个url,aop要拦截的类的方法是Action类的delUser(request,response,...)方法呢还是Service类的delUser(Long id)方法?
我觉得用filter过滤url,同时对界面的按钮和菜单做到所见即所得,不就满足要求了(其他的特殊权限当作业务逻辑),为什么要同时使用filter和aop呢?
0 请登录后投票
   发表时间:2008-11-01  
fuwang 写道
jander 写道
有这么复杂吗?
简单的权限用RBAC解决。复杂的用ACL解决。
应该是现在的标准吧。
这两个决定了谁有权限,然后用filter(web),aop(Class method)两头一截。ok。

那你是怎么让filter过滤的url和aop拦截的类的方法名做到对应的?专门建表维护这个关系?
比如 "user.do?do=delUser&userid=23" 这个url,aop要拦截的类的方法是Action类的delUser(request,response,...)方法呢还是Service类的delUser(Long id)方法?
我觉得用filter过滤url,同时对界面的按钮和菜单做到所见即所得,不就满足要求了(其他的特殊权限当作业务逻辑),为什么要同时使用filter和aop呢?


在Service中检查,因为不仅仅考虑web,还要考虑远程调用。

Service中对应的方法:
read(Document doc)
write(Document doc)
aop检查客户是否具有该doc的对应权限。

我在filter仅仅简单的检查客户是否具有某个目录的权限。
0 请登录后投票
   发表时间:2008-11-01  
andy54321 写道

问题二,如果我想权限控制粒度再细一点,比如能够控制到每个页面的每个按钮(操作),这样又该符合设计呢?


整一个标签,用于判断某个用户是否拥有操作某项业务的某个权限<判断用户A是否拥有对模块A的"添加"/"编辑"/"删除"/"查看"的权限>,如果用户拥有就让页面显示相关按钮,如果没有此权限就不让它显示即可<用标签控制>;页面实现如下所示:
<compe:competence compValue="" compName="删除" adminsInfo="${adminInfo}" serviceTypeId="${serviceId}">
<a href="javascript:check('delete');">删除</a>&nbsp;&nbsp;&nbsp;&nbsp;
</compe:competence>

不知道这样是否可行

0 请登录后投票
   发表时间:2008-11-01  
andy54321 写道
现在在进行系统的权限模块的开发,
已经建立了 user - role - permission 的关联规则,可以实现到url的控制;
问题产生,这样就要依赖url,而且可能会出现同一个url处理类中会包含处理多个业务的方法,这样就不能实现严格控制了,而且可能产生混乱,这是问题一;
问题二,如果我想权限控制粒度再细一点,比如能够控制到每个页面的每个按钮(操作),这样又该符合设计呢?

权限的控制问题应该在大部分的web程序中都会使用到的吧,
还请诸位不吝指点几句

每种类型的项目对权限的粗细粒度要求不一样,想做通用,不太可能。你应该瞄准一个特定领域进行设计。 
0 请登录后投票
   发表时间:2008-11-02  
spring security acegi
他有一个jsp标签,有权限就显示,没有权限就不显示,
但有的点繁琐,是非常繁琐,感觉太庞大了,但是可以有
解决你的问题
0 请登录后投票
   发表时间:2008-11-03  
zxming12345 写道
说一下第二个问题:

第二个问题,我们系统中是这样解决的:

操作是树形的,权限也是树形的。
举个例子,url1 是跳转到一个页面,url1可以分配权限。
这个url的页面中,其实也可以通过树形,配置功能点,这些功能点,也有url。

在页面中,写一个permision的tag,页面中的链接,写在这个tag中。这个tag就去功能树上判断当前用户有没有这个url的权限,如果有,这个链接就打出来,如果没有,这个链接就不大出来。

还有,我们系统中,还有对数据库中表和字段的权限设置。

我们需要维护一个数据字典,建表的时候,并不是直接在数据库中建表的,而是通过数据字典这个功能点建表的。

查询的时候,我们通过数据字典,封装了查询,这样在开发查询的时候,可以通过配置得到查询结果,而不用写sql了。比如首先选择查询的表,然后设置表之间的连接关系,然后可以在页面设置查询条件,分组,排序统计,最好向数据库存储一个查询。当调用查询的时候,就可以通过这个查询id 得到查询结果。
     我们可以通过数据字典,为每个用户配置每个表和每个字段的权限,当通过查询id得到查询结果的时候,就可以通过权限,判断改用户有没有对这个表的查询权限,如果有,再判断该用户没有对配置的查询的字段的权限,这是,如果一个字段,这个用户没有权限,那么,查询结果中就不包括这个字段,这样就实现了对表、字段的权限。而且简化了开发。因为sql不用写了,在页面配置一个查询就可以了。

我跟根据这个查询,还写了很多标签,比如,通过查询id 就可以利用标签,打印出列表等。列表后面的操作,也是可以配置的。这些操作,当然也会收url权限的控制。



说的很不错,如果关于你的“对数据库中表和字段的权限设置”解释的再详细一点就好了;
按你所说,可以通过配置的形式对查询模块的开发可以做到权限的严格控制,应该可以实现多样化了,不过看了解释有些不是很明白;

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics