关于系统权限的总结

权限控制包括功能控制和数据控制,这里只做功能控制的总结:
先来看一张普通权限类图表示关系:



1:功能控制:
          a)服务器端控制
          b)客户端控制
2:服务器端控制:
      可以选择的方法很多,(spring aop、struts2拦截器、filter过滤器、springmvc 拦截器等等。)不管采用哪种方式控制服务器端的访问都是一个目的:控制用户访问的url(用户访问的方法),因此对于控制就需要一个检查用户是否有此方法执行的权限,(检查用户权限的方法)。只要在用户请求某个url或者方法时 我们做一下检查如果用户有这个权限,就继续执行,没有就跳转到 没有权限的页面(自己定义)

      再来看这个方法:
      对于权限就是资源和操作,那么在系统启动的时候,可以把所有的权限(Function)数据初始化到(list、map、set、缓存、等等)中,备用。用户登录成功后可以通过用户得到用所有的权限(Function)这里包括资源和操作。
     当用户请求一个URL过来的时候,我们可以得到URL字符串,并对这个字符串做一些列的操作,最终目的是得到和数据库中Function对应的url一致的字符串,然后比较一下。如果有就方形,没有就跳转页面
 
       /**
          *url 用户请求的url
          *f 用户所拥有的操作权限(根据用户信息查找数据库得到)
        **/
         
       boolean  checkUserFunction(List<Funciton> f,Stirng url)


这样就可以控制服务器端的访问权限了。但是有个问题:对于用户登录,用户退出,有。。。一些不需要权限控制的url也做了限制。这里有种思路:
                               1)在做验证权限的时候(执行checkUserFunction)之前判断一下这个url是不是需要做权限检查,需要就检查,不需要就放行,不检查。
                               2)如果采用框架之类的验证(springaop struts2 等等),可以在要执行权限检查的方法上写个注解(自己写),然后再检查权限的时候可以方便的看看如果此方法有这个注解就验证,没有就不验证。和上面一样了。只提供思路


因为大部分系统都使用了spring ,这里建议采用spring的aop 如何配置我就不写了。每个人的配置方式可能不太一样,但是目的都是一样的。

到此服务器端的权限验证就完了。


客户端的权限检查:






            1:菜单列表 一般都是循环用户的权限得到的。
如何循环是关键:用户得到的是 存有顶级菜单的List 和存有操作链接的List (一个list里是有url的,一个是没有的 。)
提供思路:1)循环顶级菜单(用户的权限菜单) ,顶级菜单的循环里面在循环 操作链接的菜单(二级菜单)二级菜单的parentId是顶级菜单的id 根据这些可以循环出来。




这样是不是就可以看出如何做了。
先根据用户查权/限  parentid is null and id in(select funid from fun_role where  role id in (select roleid from role_user where userid =?))顶级菜单 就是关联查询。自己写吧。我瞎写了一下。
在根据用户查 parentid in (顶级菜单ids) url is not null  去掉重复的就是用户的二级菜单了。

这样就很好循环了。先循环顶级菜单的list 显示名字 在循环二级菜单的list if(parentid==id)显示名字就行了。

2) 通过自定义标签去做循环的时候把不需要的过滤出来。

比如循环顶级菜单,然后再里面做个自定义标签,传入顶级菜单的id
在tagsupport 类里自己处理,当然处理的时候,也要是需要用户的权限列表的List的。符合条件就渲染出来,不符合就跳过。
自己去看如何自定义标签吧。


        按钮的控制:

1:如果用了struts2 ,项目里面同一用了struts2的标签库,比如<s:a action=""/>
或者button ,这样就可以修改struts2的源码了,源码如何改自己想办法,提供思路:把需要修改的类找到源码,然后新建一个和他的包名一样,类名一样的类。把源码copy进去,在你需要的地方修改就可以了。检查权限(用户的权限已经查出来了。),通过action 这个名字可以很容易的得到这个按钮对应的权限url,在比较这个url和用户的权限列表,如果没有这个权限就不渲染超链接,如果有才渲染。(doStartTag 标签开始 时呼叫 和doEndTag标签结束式呼叫的方法,返回值不同有不同的含义。再整理。)

2:一般的项目可能不会用框架的标签库,这样我们就自定义一个标签用来输出,在项目开发初期设计好一个标签,便于用来做权限控制,要求项目组的用到链接的地方都用此标签。当然,这要和美工事先约定好,是用button,还是用超链接做按钮。
自定义标签mytag:a  id="" name="" action="" url="" class="" 一般就用到这些吧。然后在自定义标签里判断是否显示此按钮。

3:如果项目做得差不多了,而且项目开始时没有考虑权限控制,项目组人员有的用button 有的用a 超链接该如何做呢。在每个链接上都加上判断,如果有权限显示,没权限不显示。
我有想有另外一种做法:
        因为之前说的在存权限(菜单和操作的时候) 存了id不管是button的id 还是超链接的id还是别的id 都可以的。我们可以写一个全局的js函数,在用户访问一个连接的时候,可以得到用户的所有的操作权限的id(也就是页面中按钮或者超链接对应的id)集合。这些数据自己可以整理一下,便于使用。将这些id和所有的权限(数据库中所有的权限操作)比较(就是用户拥有的操作按钮id 和所有操作id比较) 如果没有就根据id remove掉,remove之前先判断能不能取到这个js对象。这样把这个js作为一个全局的js引入就可以了。

4:大部分项目的后台会用到一些js框架,我这次简单的使用了一下liggerUI这个框架,我想大部分框架都差不多。通过框架一般生成的按钮是根据id找不到的。也不好再自定义标签。
此时如何做呢。还是需要和上面删除remove按钮一样的思路。
不过不能根据id了。通过上面我们可以排除出来哪些按钮是不用的,可以知道id
我们就要研究js框架了,看看他是如何做的,然后根据特点把他的按钮删除掉就可以了。

下面试ligerUI的按钮删除:
toolbar : {
								items : [
										{
											text : '增加',
											icon : 'add',
											id : "dept_add",
											click : clickAdd
										},
										{
											line : true
										},
										{
											text : '修改',
											icon : 'modify',
											id:"dept_update"
										},
										{
											line : true
										},
										{
											text : '删除',
											img : '${pageContext.request.contextPath}/ui/ligerUI/skins/icons/delete.gif'
										}, {
											line : true
										}, {
											text : '部门列表',
											icon : 'search'
										} ]
							}



到这功能权限的前台控制和服务器端控制都完了。
我们可以根据项目需要选择不同的思路。

我对js框架删除不是很了解只有这一种思路,我想应该有更好的思路去解决这个js框架按钮的权限控制。















                      














猜你喜欢

转载自yjian84.iteye.com/blog/1930717
今日推荐