该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-02
sdnasky 写道 数据模型不是关键,只要保存用户-权限关系就行了
设计上的关键是找到权限控制点 界面级:自定义标签可以实现 URL级:Filter可以实现 后台方法级:AOP可以实现 数据级:良好设计+AOP可以实现 即使没有良好的设计,针对不同需求,在控制点写拦截处理类就行了,只是重复代码的问题 权限的关键是:找到控制点,拦截,然后做你想做的事情 分析得不错 |
|
返回顶楼 | |
发表时间:2011-08-02
最后修改:2011-08-02
oolala 写道 sdnasky 写道 数据模型不是关键,只要保存用户-权限关系就行了
设计上的关键是找到权限控制点 界面级:自定义标签可以实现 URL级:Filter可以实现 后台方法级:AOP可以实现 数据级:良好设计+AOP可以实现 即使没有良好的设计,针对不同需求,在控制点写拦截处理类就行了,只是重复代码的问题 权限的关键是:找到控制点,拦截,然后做你想做的事情 分析得不错
我现在也是使用自定义标签来实现的界面元素控制: <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”权限的人,也能看见保存订单按钮,那么你是不是要去修改页面? 这样每次权限定义发生变动,都要去修改页面自定义标签,跟硬编码写死权限判断有什么分别?
问题:怎么实现?这个是关键! 举个简单的例子: 一个列表页,要求:普通员工看见自己发表的信息(标题、发布时间); 部门经理看见本部门的信息(标题、发布时间 + 发布人积分); 管理员看见所有的信息(标题、发布时间、发布人积分 + 删除/修改)按钮。 这个列表页是使用web service从美国加利福尼亚州总部读取的,问,如何实现数据权限控制? 这样的需求,不是一个小小的AOP拦截就能够搞定的,即使能搞定,其复杂度也是超乎想象的。 有一个比较笨的方法,就是在服务端做权限逻辑判断,组装出当前权限应该看到的数据量和数据列,然后使用json 格式传递到视图层进行渲染,这样就相当于把视图端自定义标签所做的判断,移动到了服务端。 服务端使用策略模式,针对不同的权限,执行不同的查询逻辑; 如果有新的查询逻辑出来,就更麻烦了,理论上可以使用“页面上可视化配置 = > 动态生成java类 => 动态加载新的查询逻辑类 => 动态执行新的查询逻辑类”这样的方式来把新逻辑插入当前的判断中,但是这仅仅是理论上的设计,实际做起来,可不是上面这样三言两语能够“说”完的。 要做到数据权限的精确控制,除了和系统紧密耦合的做法和硬编码判断的做法,我还没有发现更好的实现,请楼下大牛们赶紧赐教。 ---------------------------------------------------- |
|
返回顶楼 | |
发表时间:2011-08-02
george_space 兄,写得太好了,最近我正在自己开发设计权限的管理系统,谢谢分享
|
|
返回顶楼 | |
发表时间:2011-08-02
非常同意george_space ,我遇到过的 数据过滤。 是通过 硬编码来实现。 绑定权限中的 部门, 根据用户所属的部门。 查询数据过滤。
比较麻烦。 |
|
返回顶楼 | |
发表时间:2011-08-02
最后修改:2011-08-02
数据级的权限控制最难了,特别是海量数据,RBAC是可以实现,不过实现了就死了,有一定规则的还好,可以通过用户自己设置规则逻辑,遇到没啥规则的,比较头痛,同样请大牛指点。
|
|
返回顶楼 | |
发表时间:2011-08-02
动态权限 是难上加难啊,放在持久层 牵涉的也太多了。
到现在为止我也没办法解决。不放持久层分页就会有多有少,要是少到一条都没有就麻烦了。有一点的话 还糊弄的过去。 其他层次的问题 , 我全部通过AOP 拦截。有时候还要修改拦截的数据,反正搞的权限代码也得理解业务,都不完美。 |
|
返回顶楼 | |
发表时间:2011-08-02
昏了,,彻底看昏了...
数据级权限控制,, 不是点把点的麻烦啊. |
|
返回顶楼 | |
发表时间:2011-08-03
留个印子,正好这几天在做权限,晚上回去好好看下
|
|
返回顶楼 | |
发表时间:2011-08-03
george_space 写道 oolala 写道 sdnasky 写道 数据模型不是关键,只要保存用户-权限关系就行了
设计上的关键是找到权限控制点 界面级:自定义标签可以实现 URL级:Filter可以实现 后台方法级:AOP可以实现 数据级:良好设计+AOP可以实现 即使没有良好的设计,针对不同需求,在控制点写拦截处理类就行了,只是重复代码的问题 权限的关键是:找到控制点,拦截,然后做你想做的事情 分析得不错
我现在也是使用自定义标签来实现的界面元素控制: <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”权限的人,也能看见保存订单按钮,那么你是不是要去修改页面? 这样每次权限定义发生变动,都要去修改页面自定义标签,跟硬编码写死权限判断有什么分别?
问题:怎么实现?这个是关键! 举个简单的例子: 一个列表页,要求:普通员工看见自己发表的信息(标题、发布时间); 部门经理看见本部门的信息(标题、发布时间 + 发布人积分); 管理员看见所有的信息(标题、发布时间、发布人积分 + 删除/修改)按钮。 这个列表页是使用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拦截方法调用(不调用现有方法),直接调用全新的含有数据过滤的取数据方法即可,无非是有重复代码而已 |
|
返回顶楼 | |
发表时间:2011-08-03
补充一句不是“小小的AOP” AOP是非常强大的,它是代理模式,既然都给我代理,我就可以为所欲为(拦截调用,修改参数,修改返回值,甚至调用全新的方法),都为所欲为了,还不够强大么?
|
|
返回顶楼 | |