论坛首页 Java企业应用论坛

大家的权限都是怎么实现的,有什么好的方案没有? 欢迎交流

浏览 49315 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-08-02  
sdnasky 写道
数据模型不是关键,只要保存用户-权限关系就行了
设计上的关键是找到权限控制点
界面级:自定义标签可以实现
URL级:Filter可以实现
后台方法级:AOP可以实现
数据级:良好设计+AOP可以实现

即使没有良好的设计,针对不同需求,在控制点写拦截处理类就行了,只是重复代码的问题

权限的关键是:找到控制点,拦截,然后做你想做的事情


分析得不错
0 请登录后投票
   发表时间:2011-08-02   最后修改:2011-08-02
oolala 写道
sdnasky 写道
数据模型不是关键,只要保存用户-权限关系就行了
设计上的关键是找到权限控制点
界面级:自定义标签可以实现
URL级:Filter可以实现
后台方法级:AOP可以实现
数据级:良好设计+AOP可以实现

即使没有良好的设计,针对不同需求,在控制点写拦截处理类就行了,只是重复代码的问题

权限的关键是:找到控制点,拦截,然后做你想做的事情


分析得不错


  • sdnasky写到:
  • 界面级:自定义标签可以实现

我现在也是使用自定义标签来实现的界面元素控制:
<eagle:hasPermission name="saveOrder"> 
    <input type="image" src="${rootUriOfCurrentPage}/resources/image/button/save-order.png" name="submit_top_button" id="submit_top_button" value="保存订单" />
</eagle:hasPermission>

问题:现在标签中定义拥有“saveOrder”权限的人,可以看见保存订单的按钮,但是项目交给客户以后,客户想让拥有“kissGirl”权限的人,也能看见保存订单按钮,那么你是不是要去修改页面?

这样每次权限定义发生变动,都要去修改页面自定义标签,跟硬编码写死权限判断有什么分别?

  • sdnasky写到:
  • 数据级:良好设计+AOP可以实现

问题:怎么实现?这个是关键!
举个简单的例子:
一个列表页,要求:普通员工看见自己发表的信息(标题、发布时间);
部门经理看见本部门的信息(标题、发布时间 + 发布人积分);
管理员看见所有的信息(标题、发布时间、发布人积分 + 删除/修改)按钮。

这个列表页是使用web service从美国加利福尼亚州总部读取的,问,如何实现数据权限控制?

这样的需求,不是一个小小的AOP拦截就能够搞定的,即使能搞定,其复杂度也是超乎想象的。

有一个比较笨的方法,就是在服务端做权限逻辑判断,组装出当前权限应该看到的数据量和数据列,然后使用json
格式传递到视图层进行渲染,这样就相当于把视图端自定义标签所做的判断,移动到了服务端。
服务端使用策略模式,针对不同的权限,执行不同的查询逻辑;
如果有新的查询逻辑出来,就更麻烦了,理论上可以使用“页面上可视化配置 = > 动态生成java类 => 动态加载新的查询逻辑类 => 动态执行新的查询逻辑类”这样的方式来把新逻辑插入当前的判断中,但是这仅仅是理论上的设计,实际做起来,可不是上面这样三言两语能够“说”完的。

要做到数据权限的精确控制,除了和系统紧密耦合的做法和硬编码判断的做法,我还没有发现更好的实现,请楼下大牛们赶紧赐教。
----------------------------------------------------
0 请登录后投票
   发表时间:2011-08-02  
george_space 兄,写得太好了,最近我正在自己开发设计权限的管理系统,谢谢分享
0 请登录后投票
   发表时间:2011-08-02  
非常同意george_space  ,我遇到过的 数据过滤。  是通过 硬编码来实现。  绑定权限中的 部门, 根据用户所属的部门。 查询数据过滤。
比较麻烦。
0 请登录后投票
   发表时间:2011-08-02   最后修改:2011-08-02
数据级的权限控制最难了,特别是海量数据,RBAC是可以实现,不过实现了就死了,有一定规则的还好,可以通过用户自己设置规则逻辑,遇到没啥规则的,比较头痛,同样请大牛指点。
0 请登录后投票
   发表时间:2011-08-02  
动态权限 是难上加难啊,放在持久层 牵涉的也太多了。

到现在为止我也没办法解决。不放持久层分页就会有多有少,要是少到一条都没有就麻烦了。有一点的话 还糊弄的过去。

其他层次的问题 , 我全部通过AOP 拦截。有时候还要修改拦截的数据,反正搞的权限代码也得理解业务,都不完美。
0 请登录后投票
   发表时间:2011-08-02  
昏了,,彻底看昏了...

数据级权限控制,, 不是点把点的麻烦啊.

0 请登录后投票
   发表时间:2011-08-03  
留个印子,正好这几天在做权限,晚上回去好好看下
0 请登录后投票
   发表时间:2011-08-03  
george_space 写道
oolala 写道
sdnasky 写道
数据模型不是关键,只要保存用户-权限关系就行了
设计上的关键是找到权限控制点
界面级:自定义标签可以实现
URL级:Filter可以实现
后台方法级:AOP可以实现
数据级:良好设计+AOP可以实现

即使没有良好的设计,针对不同需求,在控制点写拦截处理类就行了,只是重复代码的问题

权限的关键是:找到控制点,拦截,然后做你想做的事情


分析得不错


  • sdnasky写到:
  • 界面级:自定义标签可以实现

我现在也是使用自定义标签来实现的界面元素控制:
<eagle:hasPermission name="saveOrder"> 
    <input type="image" src="${rootUriOfCurrentPage}/resources/image/button/save-order.png" name="submit_top_button" id="submit_top_button" value="保存订单" />
</eagle:hasPermission>

问题:现在标签中定义拥有“saveOrder”权限的人,可以看见保存订单的按钮,但是项目交给客户以后,客户想让拥有“kissGirl”权限的人,也能看见保存订单按钮,那么你是不是要去修改页面?

这样每次权限定义发生变动,都要去修改页面自定义标签,跟硬编码写死权限判断有什么分别?

  • sdnasky写到:
  • 数据级:良好设计+AOP可以实现

问题:怎么实现?这个是关键!
举个简单的例子:
一个列表页,要求:普通员工看见自己发表的信息(标题、发布时间);
部门经理看见本部门的信息(标题、发布时间 + 发布人积分);
管理员看见所有的信息(标题、发布时间、发布人积分 + 删除/修改)按钮。

这个列表页是使用web service从美国加利福尼亚州总部读取的,问,如何实现数据权限控制?

这样的需求,不是一个小小的AOP拦截就能够搞定的,即使能搞定,其复杂度也是超乎想象的。

有一个比较笨的方法,就是在服务端做权限逻辑判断,组装出当前权限应该看到的数据量和数据列,然后使用json
格式传递到视图层进行渲染,这样就相当于把视图端自定义标签所做的判断,移动到了服务端。
服务端使用策略模式,针对不同的权限,执行不同的查询逻辑;
如果有新的查询逻辑出来,就更麻烦了,理论上可以使用“页面上可视化配置 = > 动态生成java类 => 动态加载新的查询逻辑类 => 动态执行新的查询逻辑类”这样的方式来把新逻辑插入当前的判断中,但是这仅仅是理论上的设计,实际做起来,可不是上面这样三言两语能够“说”完的。

要做到数据权限的精确控制,除了和系统紧密耦合的做法和硬编码判断的做法,我还没有发现更好的实现,请楼下大牛们赶紧赐教。
----------------------------------------------------


1.标签使用错误,界面标签只是标识出该控制点的唯一标识,剩下的事情由标签处理函数去取出用户权限列表,并且判断用户是否含有该权限点的唯一标识

<eagle:hasPermission id="xxx.jsp.saveorder">
    <input type="image" src="${rootUriOfCurrentPage}/resources/image/button/save-order.png" name="submit_top_button" id="submit_top_button" value="保存订单" />
</eagle:hasPermission>

权限标识可以使用命名规则,用来区分不同类型权限:菜单,界面控件,或其他的

2.取数据的方法如果设计合理,预留了可以方便添加数据过滤的接口,用AOP拦截方法调用,修改输入参数即可
即使设计不好,用AOP拦截方法调用(不调用现有方法),直接调用全新的含有数据过滤的取数据方法即可,无非是有重复代码而已
0 请登录后投票
   发表时间:2011-08-03  
补充一句不是“小小的AOP” AOP是非常强大的,它是代理模式,既然都给我代理,我就可以为所欲为(拦截调用,修改参数,修改返回值,甚至调用全新的方法),都为所欲为了,还不够强大么?
0 请登录后投票
论坛首页 Java企业应用版

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