操作权的管理的疑问

moshangcheng 2010-09-08

       最近学做权限管理,打算用spring的拦截器实现基于角色的权限管理。我准备先实现操作权限的管理,数据权限的管理计划以后再做。程序前端页面用extjs设计,后台使用基于spring的action、service、dao三层设计。权限管理的大体设计是这样:
       操作权限的管理用spring的拦截器拦截service层的方法实现。首先将servic层的方法归类,分为添加、修改、删除等操作类型,存储后建立操作类型的表ACTION;然后将所有service类的包路径存储,建立资源的表RESOURCE;将ACTION和SERVICE表组合,建立权限的表PERMISSION;将PERMISSION表和ROLE表组合,得到角色权限表ROLE_PERMISSION。使用spring的拦截器拦截service的方法,获得被拦截的service类的包路径和被调用的方法名,组合得到权限,然后判断登录的角色是否具有该权限,进行操作的拦截。
      以上是在服务器端进行的操作拦截,在用户界面还可以读取ROLE_PERMISSION表控制按钮的显示。比如一个页面的“添加”按钮对应某个service的add()方法,如果登录用户不具有该权限,则将按钮隐藏。

      然而有一个难点,比如某个按钮点击后触发后台action的一个方法,但是在该方法内部调用了多个service的方法或一个service的多个方法,这样机会出现相应请求需要多个权限的问题。

      我目前想到的解决方案有两个:方案一是在一个action的方法内部只调用service的一个方法,在service的方法内部调用多个dao类的方法进行数据库操作,从而保证一个按钮只对应一个权限;方案二则是一个按钮对应多个权限,登陆用户不具备其中一个权限,则该按钮不显示,后台action的方法的设计,就可以根据该按钮的权限调用相应的service方法。我比较偏向于方案一。
      我是一个新手,上面的方案肯定有很多不完善甚至错误的地方,恳请各位高手多多指教,我在这里先谢谢了。

metadmin 2010-09-08
呵呵   权限管理最佳实践:二,URL权限控制,这里我谈到了为什么不使用service模式来代替功能权限。

从客户角度出发,我认为URL就是权限是最合适的。URL背后的ACTION控制权限。比如没用该权限,ACTION都应该不被执行,更不能调用背后的service(s)了
moshangcheng 2010-09-08
metadmin 写道
呵呵   权限管理最佳实践:二,URL权限控制,这里我谈到了为什么不使用service模式来代替功能权限。

从客户角度出发,我认为URL就是权限是最合适的。URL背后的ACTION控制权限。比如没用该权限,ACTION都应该不被执行,更不能调用背后的service(s)了
嗯,我去看看,谢谢你的热心回答。
liangpeng009 2010-10-14
我有个很大的问题数据库里保存了观看的URL那么修改的时候怎么办!一个修改操作要两个ACTION的!这个问题在我的项目里没有解决!我是将do操作放行,然后在ACTION里拦截报错!希望老鸟指点!!
rabo 2010-10-14
所以,我认为功能权限应该定义URL,而不是ACTION。这样就解决了问题了吧?!

但ACTION里面有数据级权限需要控制,你可以使用硬编码模式,也可以才有RALASAFE来帮助你
metadmin 2010-10-16
liangpeng009 写道
我有个很大的问题数据库里保存了观看的URL   那么修改的时候怎么办!


修改是指什么场景?没有弄明白你的意思。
Global site tag (gtag.js) - Google Analytics