关于权限控制的讨论
来源:互联网 发布:万网已备案域名转让 编辑:程序博客网 时间:2024/05/29 10:23
在许多的实际应用中,不只是要求用户简单地进行注册登录,还要求不同类别的用户对资源有不同的操作权限。目前,权限管理系统也是重复开发率最高的模块之一。
1. 菜单级别
2. 页面元素级别
3. 数据级别
目前好像用的比较多的是基于RBAC的,我经常用的也就是控制到菜单级别,对于控制页面元素和数据级别用的不是很多,目前需要解决权限控制到页面元素级别,网上看了很多但是不是很明白。不知大家有什么好的解决方案没有。大家的表都是怎样设计的?希望高手们不吝指点,有什么好的方案让借鉴借鉴。
我的目前表主要就包括5张:
用户表;角色表;菜单表(包括一级菜单、二级菜单) ;用户和角色的关联表(用户角色多对多);角色和菜单的关联表等。
随着系统的日益庞大,为了方便管理,可引入角色组对角色进行分类管理,跟用户组不同,角色组不参与授权。例如:某电网系统的权限管理模块中,角色就是挂在区局下,而区局在这里可当作角色组,它不参于权限分配。另外,为方便上面各主表自身的管理与查找,可采用树型结构,如菜单树、功能树等,当然这些可不需要参于权限分配。
有时候需要单独为一个用户增加一两个权限的,这时候单独为这个用户设计一个“角色”,不值得,所以我设计的是:既可以通过角色为用户分配权限,也可以直接将权限分配给用户。
--------------------------------------------
我接触过的几个开发人员,都不明白为什么要直接给用户分配权限,但是在软件的实际应用中,如果完全基于“角色”为人员分配权限,你会 发现角色之间重复、冗余的权限很多,这样反复的定义多种多样的“角色”,还不如设计成可以直接为人员分配权限呢。
--------------------------------------------
权限管理基本上分为以下几个步骤:
1、定义权限-》定义角色-》为人员分配角色(或者直接分配权限),这是一个分配权限的过程;
--------------------------------------------
2、定义受保护资源-》为“受保护资源”指定授权权限,这是一个授权的过程;
--------------------------------------------
3、应用程序请求“受保护资源”-》“受保护资源”的授权权限与人员持有的权限进行匹配-》匹配成功,允许访问资源,匹配失败,不允许访问资源,这是一个认证的过程。
--------------------------------------------
上面这三个过程,是典型的“操作权限”的流程。
--------------------------------------------
关于“页面元素”的控制,目前多数权限管理系统,都是用“自定义权限标签”来控制页面元素的显示与否的。
我目前也是这样实现的,但是我一直认为:其实用“自定义权限标签”来控制页面元素的显示与否,跟直接在视图中使用程序逻辑判断,是一样的,并没有做到“灵活配置”,当权限编码改变,或者权限含义改变时,还是要去动页面的标签,所以跟写死没什么分别。
如果页面元素是通过服务端组装成json,或者别的格式的数据,然后返回到视图层进行渲染,这样的话,就可以做到“页面元素的权限灵活配置了”,可以通过数据库定义那些按钮对那些权限或角色进行显示。
“服务端组装视图层组件,返回视图层渲染”,这个模式虽然做到了“对页面元素的权限灵活配置”,但是牺牲掉了很多东西,比如加大了服务端的复杂度,使得页面的设计更加“程序员化”,而不是“美工化”等。
--------------------------------------------
至于最关键的“数据权限”,也就是人员对数据的读取深度的控制,是更为复杂的流程。
--------------------------------------------
对于“数据深度”的控制,我目前的做法是和业务结合的非常紧密,即:在读取数据的程序中,比如“列表”页,首先判断当前登陆者有没有“读取任意深度的权限”,如果有,就不做读取限制;如果没有,则判断当前登录人员是不是部门主管,如果是,则递归读取本部门下的所有数据,如果不是主管,则只读取自己的数据。
--------------------------------------------
“数据深度”的控制,细设计的话,应该可以更通用,更灵活,大家有什么更好的思路,可以讨论一下。
--------------------------------------------
我目前设计的是一个人员只能有一个“角色”,当然,如果设计成一个人员有多个“角色”,也不是很复杂的事情,在“用户表”和“角色表”之间增加一个“用户-角色映射表”就可以了,但是为了系统的简单起见,我把这种设计简化了。
--------------------------------------------
以下是我的“权限控制”的部分数据模型:
我目前比较关心的是:
1、数据权限(读取数据的深度)有什么更通用的设计?
2、页面元素的控制,除了使用“自定义权限标签”,或者“服务端组装视图层组件”两种方法,还有没有更好的设计?
- 关于权限控制的讨论
- 关于权限控制的讨论
- 关于权限控制的讨论
- ITeye论坛关于权限控制的讨论
- 关于权限控制的讨论:操作与数据
- 类的访问控制权限讨论
- 关于ffmpeg中的VBR控制的讨论
- 关于svn权限的控制
- 关于目录文件所需权限的讨论
- 关于ffmpeg中的VBR控制的讨论(编码时参数设置)
- 关于用户-角色-权限控制的疑问
- 关于java访问权限控制的误区
- 关于svn权限控制的配置
- 关于Java权限控制SecurityManager的理解
- 关于权限控制的讨论集
- 关于页面权限控制
- 关于权限控制
- 关于BigInteger控制权限
- java加强--IO流
- 本地计算机网络信息的获取
- 黑马程序员-关于varchar 和nvarchar
- 读书时间 C++ Standard Lib 2012/05/19
- 黑马程序员-文本框居然还有Lines这个属性?
- 关于权限控制的讨论
- 黑马程序员-+=与AppendText()的区别
- <转>矩阵求导
- get URL方式传递中文
- java基础--线程总结
- SpirngMVC数据绑定
- INIT_LIST_HEAD无法初始化链表指针
- Android 入门基础(6) ---收集android开发常用术语
- java加强--正则表达式总结