`
冰火特蕾莎
  • 浏览: 20765 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

老生常談-權限控制的一些話題

    博客分类:
  • Java
阅读更多

權限判斷一向蔸諟大伙儿常谈的话题啦。偶列举一下比较常见的做法吧(注意,是常见的)

数据库端最简单的可能 是会建 权限实体表、角色表、用户表,偶称其为权限基础表、以及三者之间的关联表。

当然复杂一点的有url到权限或者角色的关联表,用以管理url访问的权限控制。

或者一些其他资源与权限基础表之间的关联,总之就是做一些与具体业务挂钩的扩展啦。

 

茬后代代码端,多半会在某一处施加拦截器用以做权限判断吧。

例如用xwork的拦截器拦截action,通过当前用户色角色以及Action的访问url路径 再加上权限实体三者之间的映射关系来判断用户是否有访问Action的权利。

当然也有用AspectJ的方式来实现,不过原理是一样的。

 

在前台页面上,首先说导航菜单这一块儿。后台肯定是有一个导航菜单表跟角色关联啦,不同的角色登陆进来能看到不同的菜单。这不是问题,因为几个简单的迭代就出菜单啦。

 

最麻烦就是业务页面上这一块儿,按钮级的权限控制,真的是很麻烦呢。

很多人怕麻烦,直接省略掉前台按钮级的权限控制,如果你点了你不能点的按钮,就给个提示说“你不够格”。

 

但理论上,应该直接屏蔽掉这个按钮是最好的,但是应该怎么做呢?

硬编码,偶肯定会被人说菜菜啦。

 

偶目前想到的是用tag的方式。但使用范围太窄了呀。并且,一旦用了tag,前台页面就依赖于这个tag了,换句话说,以后要是决定不用tag了,还很麻烦滴。再者,在我的tag还没出来以前,人家做业务的就没法动手写页面了。因为写了以后还得改,这也是偶不想看见的。

 

有没有类似于AOP一样的无侵入式的方法,能够很优雅的解决视图层的权限控制的问题呢?偶想虚心学习哦

分享到:
评论
36 楼 areha001 2009-11-11  
类似于 ROR 中 ViewHelper
35 楼 ayhome 2009-11-10  
helian 写道
ayhome 写道
呵呵 有点搞不懂  既然都控制到了URL权限
---------------------------------------
可以通过URL来控制按钮
先自己完全实现按钮的显示,也就是用后台代码封装好HTML 然后显示出来,
在后台代码加个判断当前URL 然后根据当前用户角色是否有此按钮的权限 没有就直接 返回空啊


这种方法我也想过。有没有现成的开源项目?我没找到过。



昏,我自己就这么做的,我还以为自己的方法都落后了. 加我QQ 大家一起商讨 462063493
34 楼 hsbljyy 2009-11-10  
哦,那个啥,火星文真的不适合在这片土壤存在。或者你也可以叫我小心眼男
33 楼 hsbljyy 2009-11-10  
如果是B/S的应用,而且只是操作权限的话,URL足以。至于要控制页面的按钮的显示,我的建议是用JavaScript来做,这样就不用统一模块的页面,由于权限的不同要做多个页面或者要写很多if else 之类的判断。这些完全可以交给客户端(浏览器),这样可以在一定程度上减轻服务器的压力。
至于按钮或者菜单触发的事件,至于用户的每次操作还是得通过服务器进行验证,也就是说,一个Action类的方法就是一个操作权限。
至于数据权限,这个跟业务结合得比较密切,我暂时没有比较通用的解决方案。
32 楼 helian 2009-11-10  
ayhome 写道
呵呵 有点搞不懂  既然都控制到了URL权限
---------------------------------------
可以通过URL来控制按钮
先自己完全实现按钮的显示,也就是用后台代码封装好HTML 然后显示出来,
在后台代码加个判断当前URL 然后根据当前用户角色是否有此按钮的权限 没有就直接 返回空啊


这种方法我也想过。有没有现成的开源项目?我没找到过。
31 楼 冰火特蕾莎 2009-11-10  
yuan 写道
我是为不同权限准备不同的视图模板。
比如访问index的时候,普通用户就跳转到index.html,管理员则跳转到admin_index.html。两个模板之间重复的代码的部分提出来,作为partial,分别往index.html和admin_index.html中渲染。嗯,我说的是我在rails中的解决方案。不知道Java有没有类似的东东。

p.s 我也是小心眼男


你这样是不行的哦,因为系统中的角色除了预置的超级管理员外,其他角色都是由超级管理员,或者用户权限管理员动态生成的哦
30 楼 ayhome 2009-11-10  
呵呵 有点搞不懂  既然都控制到了URL权限
---------------------------------------
可以通过URL来控制按钮
先自己完全实现按钮的显示,也就是用后台代码封装好HTML 然后显示出来,
在后台代码加个判断当前URL 然后根据当前用户角色是否有此按钮的权限 没有就直接 返回空啊
29 楼 qbq 2009-11-10  
动态页面 只用静态的标签语言应该是实现不了的
28 楼 giginet 2009-11-10  
BTW:hoho,偶也曾一度使用火星文,虽然俺不是90后。。。。不过火星文嘛,休闲可以,如果提问题,回问题的看起来就很苦恼了。
27 楼 giginet 2009-11-10  
<div class="quote_title">冰火特蕾莎 写道</div>
<div class="quote_div">
<p>偶目前想到的是用tag的方式。但使用范围太窄了呀。并且,一旦用了tag,前台页面就依赖于这个tag了,换句话说,以后要是决定不用tag了,还很麻烦滴。再者,在我的tag还没出来以前,人家做业务的就没法动手写页面了。因为写了以后还得改,这也是偶不想看见的。</p>
<p> </p>
<p><span style="color: #ff0000;">有没有类似于<strong>AOP</strong>一样的无侵入式的方法,能够很优雅的解决<span style="color: #ff0000;"><strong>视图层的权限控制</strong></span>的问题呢?偶想虚心学习哦</span></p>
</div>
<p>看你的权限粒度要细到什么程度了。个人感觉这些东西是和业务相关的,很难做到无侵入的。毕竟权限是分两个层次了,一个是通用的,还有一个就是业务相关的。通用的一般粒度都比较粗,是可以分开的,而业务权限一般都比较复杂,很难做到无侵入。这也是为什么一直以来没有通用权限框架的原因。我想你明白了这两个权限的含义后应该心里有底了。</p>
<p>一般业务相关的,统一使用tag我觉得是一个不错的方式,看起来清晰多了。你这里想把tag从表示层驱除,也是一个很麻烦的地方,hoho。很多人都说表示层不该有业务逻辑,其实我觉得表示层也是有表示层的逻辑的,想要驱除,同样很难。只能根据情况,尽可能的驱除,但不能绝对。tag在表示层已经很简单的,做到这步就足够了。</p>
<p>至于标签的开发,不会影响别人页面的进度。你可以先设计一个没有任何功能的空tag就是了,具体业务再慢慢写。</p>
26 楼 konant 2009-11-10  
可以对按钮Id采用唯一的标识, 同时在权限实体表增加关联按钮字段, 通过自定义标签对该按钮进行权限校验, 没有相应权限则隐藏按钮.
25 楼 fengsuiyijing 2009-11-10  
没必要为了前台的干净而给自己找麻烦。这种情况在页面嵌入Java代码是最简单的方法。当然,如果类似情况很多,就用自定义标签吧。
24 楼 areha001 2009-11-10  
要追求界面纯粹的干净的,不包含一点逻辑,10个按钮就是1024个模版。。。

没必要吧
23 楼 helian 2009-11-09  
yuan 写道
helian 写道
yuan 写道
我是为不同权限准备不同的视图模板。
比如访问index的时候,普通用户就跳转到index.html,管理员则跳转到admin_index.html。两个模板之间重复的代码的部分提出来,作为partial,分别往index.html和admin_index.html中渲染。嗯,我说的是我在rails中的解决方案。不知道Java有没有类似的东东。

p.s 我也是小心眼男


那要是系统内有10个角色,每个角色对index页面上的组件权限都不同,有只读,有修改,有屏蔽。。。

怎么办

这个我也想了,似乎每添加一种角色,增加的代码量不多,因为相同的部分都提取出来了,不同权限之间不一样的只是按钮。不过模板文件会多出来。管理文件麻烦不?我也不知道……哈哈,好像也不是很完美的解决方案。我只是抛抛我的砖。


界面永远是脏活累活啊
22 楼 yuan 2009-11-09  
helian 写道
yuan 写道
我是为不同权限准备不同的视图模板。
比如访问index的时候,普通用户就跳转到index.html,管理员则跳转到admin_index.html。两个模板之间重复的代码的部分提出来,作为partial,分别往index.html和admin_index.html中渲染。嗯,我说的是我在rails中的解决方案。不知道Java有没有类似的东东。

p.s 我也是小心眼男


那要是系统内有10个角色,每个角色对index页面上的组件权限都不同,有只读,有修改,有屏蔽。。。

怎么办

这个我也想了,似乎每添加一种角色,增加的代码量不多,因为相同的部分都提取出来了,不同权限之间不一样的只是按钮。不过模板文件会多出来。管理文件麻烦不?我也不知道……哈哈,好像也不是很完美的解决方案。我只是抛抛我的砖。
21 楼 helian 2009-11-09  
yuan 写道
我是为不同权限准备不同的视图模板。
比如访问index的时候,普通用户就跳转到index.html,管理员则跳转到admin_index.html。两个模板之间重复的代码的部分提出来,作为partial,分别往index.html和admin_index.html中渲染。嗯,我说的是我在rails中的解决方案。不知道Java有没有类似的东东。

p.s 我也是小心眼男


那要是系统内有10个角色,每个角色对index页面上的组件权限都不同,有只读,有修改,有屏蔽。。。

怎么办
20 楼 yuan 2009-11-09  
我是为不同权限准备不同的视图模板。
比如访问index的时候,普通用户就跳转到index.html,管理员则跳转到admin_index.html。两个模板之间重复的代码的部分提出来,作为partial,分别往index.html和admin_index.html中渲染。嗯,我说的是我在rails中的解决方案。不知道Java有没有类似的东东。

p.s 我也是小心眼男
19 楼 helian 2009-11-09  
界面按钮那一级的我是没看到过好的解决方案,有高手解惑么?
18 楼 key232323 2009-11-09  
感觉还是 整体 mvc

page(即几个html构成的一组相关页面)内用event-driven形式的。Action类有专门的event-handler,专门给类似dwr前段调用的

这样在各个层面都可以容易做到权限控制
17 楼 wangdgsc 2009-11-09  
前端,好一点的就只能是使用自定义标签,把里面的一些值都搞成动态的,除此之外,我想不出更好的办法,如果你准备使用标签,那么这个标签应该就算是你的工具类,在架构系统框架的时候就要编写的(我是这样觉得),所以等业务程序员编写代码时,那个标签已经存在了,也就不存在还需要修改的道理了,如果是自定义标签,而且能符合你项目的需求,那么,应该不存在哪天不用的道理啊,如果不要用这个标签,那就只能说明是不需要做到所见既所得,那你就直接将按钮或链接输出,把判断那一块给注释,也能解决你的问题啊,说句难听的俗语,别介意啊,又要做婊子,又想立牌坊,呵呵,难啊

相关推荐

    老生常谈js-react组件生命周期

    对于React 16.3及以上版本,新增了两个静态方法static getDerivedStateFromProps和getSnapshotBeforeUpdate用于替代一些旧的生命周期方法。 理解React组件生命周期及其方法,对于优化组件渲染性能和管理组件状态都...

    老生常谈外链 站长要做到对症下药.pps

    老生常谈外链 站长要做到对症下药.pps

    单元测试进行曲

    单元测试进行曲单元测试又是老生常谈-'单元测试',说实话自己在单元测试上是'语言上的巨人,行动上的矮子',属于那种说的比做的多的人^_^。不过也不能说什么也没做。记得去年年末的时候自己还设计并实现过一个简单的...

    老生常谈js动态添加事件--- 事件委托

    如果事件处理器绑定了过多的事件,可能会造成性能问题,特别是在一些包含大量子元素的父元素上绑定处理器时。此外,如果事件冒泡被子元素内部的事件处理器阻止了,那么父元素上的事件监听器将不会触发。这就需要...

    老生常谈ProgressBar、ProgessDialog的用法

    ProgressBar和ProgressDialog是Android开发中常见的两种进度条控件,用于展示任务执行的进度或等待状态。下面我们将深入探讨这两种控件的用法。 首先,ProgressBar是一个可以显示具体进度的组件,它可以是圆形或...

    jQuery-Kwicks-Animation:Kwicks 图书馆是老生常谈,但却是个好东西。 如果您想计算它生成的不同事件并制作幻灯片,这里有一些 javascript 可以帮助您。 我花了一些时间,所以可能会为您节省一些时间

    jQuery-Kwicks-Amination Kwicks 图书馆是老生常谈,但却是个好东西。 如果您想计算它生成的不同事件并制作幻灯片,这里有一些 javascript 可以帮助您。 我花了一些时间,所以可能会为您节省一些时间:) 看看它在行动

    电子技术的老生常谈——接地.pdf

    正如标题所言,《电子技术的老生常谈——接地》一文中提到的那样,尽管接地的基本概念在每一次培训和交流中都会被提及,但往往缺乏一个通用而全面的方法论指导。本文旨在深入探讨接地的各种类型、目的以及具体的实施...

    重构-改善既有代码的设计.chm

    当对象技术成为老生常谈之后——尤其在Java编程语言之中,新的问题也在软件开发社区中浮现了出来。缺乏经验的开发人员完成了大量粗劣设计,获得的程序不但缺乏效率,也难以维护和扩展。渐渐地,软件系统专家发现,与...

    老生常谈javascript的面向对象思想

    在进行JavaScript编程的过程中,面向对象思想一直是一个核心的概念。面向对象编程(OOP)是通过创建对象来模拟现实世界的一种编程范式。在JavaScript中,对象可以通过不同的方法创建和定义。面向对象有三大基本特性...

    老生常谈android中的事件传递和处理机制

    总结来说,Android中的事件传递和处理机制是一个深度和广度都很大的话题,涉及到UI设计的许多细节。理解这一机制能够帮助开发者更好地控制用户交互,提高应用的用户体验。通过不断实践和学习,开发者可以熟练掌握这...

    老生常谈java中的fail-fast机制

    Java中的Fail-Fast机制详解 Java中的Fail-Fast机制是一种错误检测机制,当多个线程对集合进行结构上的改变操作时,有可能会产生Fail-Fast机制。这种机制是Java集合框架的一部分,可以帮助检测并发修改引发的错误。...

    老生常谈PHP位运算的用途

    举个例子,我们可以定义一些权限常量: ```php define("mDELETE", 8); define("mUPLOAD", 4); define("mWRITE", 2); define("mREAD", 1); ``` 在这里,我们定义了四个权限常量,每个权限对应一个特定的二进制位。8、...

    老生常谈的24种Java设计模式

    Java设计模式是在特定环境下,为了解决某类重复出现的问题而总结出来的一套成功或有效的解决方案。这些设计模式旨在提高代码的可重用性、可维护性和可扩展性。 设计模式通常包含以下几个关键要素: ...

    老生常谈js中的MVC

    JavaScript中的MVC(Model-View-Controller)是一种广泛应用于Web开发的架构模式,它将复杂的交互逻辑分解为三个相互协作的部分:模型、视图和控制器。 1. **模型(Model)**: 模型主要负责存储和管理应用的数据...

    老生常谈Bootstrap媒体对象

    5. **浮动控制**:使用`.media-left`和`.media-right`类来控制媒体对象在主体中的浮动方式,分别使媒体对象向左或向右浮动,并与其他内容保持一定的间距。 在HTML结构中,`.media-right`应当放在`.media-body`的...

    老生常谈Log4j和Log4j2的区别(推荐)

    Log4j和Log4j2的区别 Log4j和Log4j2是两个常用的日志记录工具,它们都来自Apache开源项目。虽然它们都是日志记录工具,但是它们之间有很多区别。下面我们将从配置文件类型、核心JAR包、文件渲染和Log调用四个方面来...

    老生常谈position定位——让人又爱又恨的属性

    在CSS世界里,`position`属性是一个至关重要的概念,它决定了元素在页面上的布局方式,因此被称为“老生常谈”的话题。`position`属性控制元素的定位模式,赋予开发者极大的灵活性来创建复杂的布局。然而,这也是一...

    老生常谈之Java中堆和栈的概念和区别

    可以通过调整JVM的启动参数,如-Xss控制栈的大小,-Xms和-Xmx控制堆的初始大小和最大大小,来优化程序的性能。 总结来说,Java中的堆和栈各有优势和特点:堆适合存储复杂、生命周期长的对象,而栈则适用于快速存取...

Global site tag (gtag.js) - Google Analytics