`
isiqi
  • 浏览: 16366442 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

关于权限设计的探讨

阅读更多

但凡涉及多用户不同权限的网络或者单机程序,都会有权限管理的问题,比较突出的是MIS系统。

下面我要说的是MIS系统权限管理的数据库设计及实现,当然,这些思路也可以推广开来应用,比如说在BBS中用来管理不同级别的用户权限。

权限设计通常包括数据库设计、应用程序接口(API)设计、程序实现三个部分。

这三个部分相互依存,密不可分,要实现完善的权限管理体系,必须考虑到每一个环节可行性与复杂程度甚至执行效率。

我们将权限分类,首先是针对数据存取的权限,通常有录入、浏览、修改、删除四种,其次是功能,它可以包括例如统计等所有非直接数据存取操作,另外,我们还可能对一些关键数据表某些字段的存取进行限制。除此,我想不出还有另外种类的权限类别。

完善的权限设计应该具有充分的可扩展性,也就是说,系统增加了新的其它功能不应该对整个权限管理体系带来较大的变化,要达到这个目的,首先是数据库设计合理,其次是应用程序接口规范。

我们先讨论数据库设计。通常我们使用关系数据库,这里不讨论基于Lotus产品的权限管理。

权限表及相关内容大体可以用六个表来描述,如下:
1 角色(即用户组)表:包括三个字段,ID,角色名,对该角色的描述;
2 用户表:包括三个或以上字段,ID,用户名,对该用户的描述,其它(如地址、电话等信息);
3 角色-用户对应表:该表记录用户与角色之间的对应关系,一个用户可以隶属于多个角色,一个角色组也可拥有多个用户。包括三个字段,ID,角色ID,用户ID;
4 限制内容列表:该表记录所有需要加以权限区分限制的数据表、功能和字段等内容及其描述,包括三个字段,ID,名称,描述;
5 权限列表:该表记录所有要加以控制的权限,如录入、修改、删除、执行等,也包括三个字段,ID,名称,描述;
6 权限-角色-用户对应表:一般情况下,我们对角色/用户所拥有的权限做如下规定,角色拥有明令允许的权限,其它一律禁止,用户继承所属角色的全部权限,在此范围内的权限除明令禁止外全部允许,范围外权限除明令允许外全部禁止。该表的设计是权限管理的重点,设计的思路也很多,可以说各有千秋,不能生搬硬套说某种方法好。对此,我的看法是就个人情况,找自己觉得合适能解决问题的用。

先说第一种也是最容易理解的方法,设计五个字段:ID,限制内容ID,权限ID,角色/用户类型(布尔型字段,用来描述一条记录记录的是角色权限还是用户权限),角色/用户ID,权限类型(布尔型字段,用来描述一条记录表示允许还是禁止)

好了,有这六个表,根据表六,我们就可以知道某个角色/用户到底拥有/禁止某种权限。

或者说,这么设计已经足够了,我们完全实现了所需要的功能:可以对角色和用户分别进行权限定制,也具有相当的可扩展性,比如说增加了新功能,我们只需要添加一条或者几条记录就可以,同时应用程序接口也无须改动,具有相当的可行性。但是,在程序实现的过程中,我们发现,使用这种方法并不是十分科学,例如浏览某个用户所拥有的权限时,需要对数据库进行多次(甚至是递归)查询,极不方便。于是我们需要想其它的办法。使用过Unix系统的人们都知道,Unix文件系统将对文件的操作权限分为三种:读、写和执行,分别用1、2、4三个代码标识,对用户同时具有读写权限的文件被记录为3,即1+2。我们也可以用类似的办法来解决这个问题。初步的想法是修改权限列表,加入一个字段:标识码,例如,我们可以将录入权限标识为1,浏览权限标识为2,修改权限标识为4,删除权限标识为8,执行权限标识为16,这样,我们通过权限累加的办法就可以轻易的将原本要分为几条记录描述的权限放在一起了,例如,假定某用户ID为1,库存表对应的限制内容ID为2,同时规定角色类型为0、用户类型为1,我们就可以将该用户具有录入、浏览、修改、删除库存表的权限描述为:2,15,1,1。

确实很简单,不是吗?甚至还有更过激的办法,将限制内容列表也加上一列,定义好标识码,这样,我们甚至可以用简单的一条记录描述某个用户具有的对全部内容所具有的全部权限了。当然,这样做的前提是限制内容数量比较小,不然,呵呵,2的n次方递增起来可是数量惊人,不容易解析的。

从表面上看,上述方法足以达到实现功能、简化数据库设计及实现的复杂度这个目的,但这样做有个弊端,我们所涉及的权限列表不是相互独立而是互相依赖的,比如说修改权限,其实是包含浏览权限的,例如,我们可能只是简单的设置用户对库存表存取的权限值为录入+修改+删除(1+4+8=13),但事实上,该用户具有(1+2+4+8=15)的权限,也就是说,在这种方案中,13=15。于是当我们调用API询问某用户是否具有浏览权限时,就必须判断该用户是否具有对该数据表的修改权限,因此,如果不能在程序中固化权限之间的包含关系,就不能利用应用程序接口简单的做出判断。但这与我们的目的“充分的可扩展性”矛盾。

这个问题如何解决?我想到了另外一种设置标识码的方法,那就是利用素数。我们不妨将录入、浏览、修改、删除、执行的基本标志码定为2,3,5,7,11,当遇到权限互相包含的时候,我们将它的标识码设定为两个(或多个)基本标志码的乘积,例如,可以将“修改”功能的标志码定为3*5=15,然后将所有的权限相乘,就得到了我们需要的最终权限标识值。这样,我们在询问用户是否具有某项权限的时候,只需要将最终的值分解成质因子,例如,我们可以定义一个用户具有录入+修改+删除库存表的权限为 2*15*7=2*3*5*7,即表示,该用户具有了对库存表录入+浏览+修改+删除权限。

当然,对权限列表我们使用上述方法的前提是权限列表记录条数不会太多并且关系不是十分复杂,否则,光是解析权限代码就要机器忽悠半宿:)

我希望以上的分析是正确且有效的(事实上,我也用这些的方法在不止一套系统中实现),但无论如何,我觉得如此实现权限管理,只是考虑了数据库设计和应用程序接口两部分内容,对于实现,还是显得很费劲。因此,我恳请有过类似设计、实现经验的同志们提出建设性的意见和修改建议。

另外,关于数据库设计的思路还有使用二维表的,这将在以后的时间里讨论,关于应用程序接口的设计和实现我也将在利用另外篇幅和大家共同探讨,代码将用类C语法实现(我不喜欢pascal,抱歉)

另外,有朋友提到:

权限设计需求:
1、用以实现对界面对象(如菜单、按钮)的权限控制。简称对象级权限
2、用以实现对数据能否被某一个用户修改、删除的权限控制。建成数据级权限

对象级权限基本上大家都实现过,数据级权限比较特殊,它能够实现数据的权限分配
例如:A用户可以将其产生的数据分配给B用户修改,给C用户删除的权限。

数据级权限的要点就是要在表中增加一个字段用以保存数据所有者的用户标识。


我的想法是这样:

数据级权限的管理和对象权限有比较大的区别,它不容易使用一条语句精确的描述,Notes的做法是保存每个文档的所有者标识,在关系型数据库中也可以使用相同(或者类似)的办法解决,但情况要复杂一些。

如果要实现对单条数据的存取控制,恐怕只能用流程来实现,这种手段在OA系统中比较常见,比如将A写的某个公文文档移交给B审批,这时B获得的只是对所有者A某一个而不是所有文档的审批权限。虽然也是赋予了B某种权限,但事实上这不属于上文所讨论的权限管理范围,而只是业务流程。

但是我们考虑,在非公文流程的大部分系统中,只是简单的设定:用户B具有对所有者A的文档具有修改权限,而这种定义,是可以在上文描述的数据库进行描述并实现的。

事实上,在关系型数据库中,要对某个用户对表的存取权限精确到记录是不可能的,这只能在程序中使用聪明巧妙或者笨办法解决,当然,与之相关的是业务流程的设计。很多OA系统自称能自定义流程,大体也就是能通过巧妙的数据库设计,将流程运作的全过程记录在数据库中。

基于Lotus的OA系统理论上可以定义某个用户对某个文档的存取权限,但实际操作中,为了减轻开发人员的负担,都只是定义了角色对某个数据库的存取权限,而将剩下的内容交由前端控制,这和我们在ASP程序中习惯使用SA登录SQL Server是一样的。

业务流程的实现方法本质上和操作权限无关,它将是另外一个讨论话题。

分享到:
评论

相关推荐

    关于权限设计的探讨.pdf

    关于权限设计的探讨 权限设计是多用户系统和网络应用程序中不可或缺的一部分,特别是在MIS系统中。权限设计通常包括数据库设计、应用程序接口(API)设计、程序实现三个部分,这三个部分相互依存,密不可分。 在权限...

    J2EE综合--关于权限设计的详细探讨

    在J2EE权限设计中,构建一个高效且可扩展的权限治理体系是至关重要的。权限设计主要涵盖三个方面:数据库设计、应用程序接口(API)设计以及程序实现。这三个方面相互依赖,共同确保系统的安全性和灵活性。 首先,...

    权限设计原理(原创)

    权限设计的扩展思路探讨了如何适应未来可能出现的新需求和变化,如动态权限调整和多维度权限控制。最后,需要注意的几个问题包括权限冲突解决、权限审计和权限撤销机制的建立。 三、RBAC(Role-Based Access ...

    系统框架权限设计杂谈论文

    这篇名为“系统框架权限设计杂谈论文”的文档很可能是对这一领域的深入探讨。权限设计是任何复杂系统的核心组成部分,特别是在多用户环境中,如何合理地分配和管理权限,确保数据安全并防止未授权访问,是系统架构师...

    应用程序权限设计-权限的控制程度不同的设计方案

    本文将深入探讨六种常见的权限设计方案及其优缺点。 #### 二、基于角色的权限设计 **概念**:基于角色的权限设计(Role-Based Access Control, RBAC)是一种常见的权限管理方法,它通过赋予用户不同的角色来控制其...

    java用户权限设计

    在Java编程领域,权限设计是构建安全应用程序的关键组成部分。它涉及到如何管理用户访问资源的权限,确保只有授权的用户或系统组件能够执行特定的操作。在这个主题中,"java用户权限设计"涵盖了多个重要知识点,包括...

    c#开发之权限设计和应用

    本文将深入探讨C#中的权限设计及其应用,并结合提供的资源——一个PPT和实例教程,帮助读者理解和掌握这一核心概念。 首先,权限设计的基本理念是根据用户的角色或身份来确定他们对系统资源的访问权限。在C#中,...

    权限设计VSD

    "权限设计VSD"很可能是指使用Visio(一个微软出品的图表绘制软件,VSD是其文件格式)创建的关于权限控制系统的蓝图。下面我们将深入探讨权限设计的核心概念、重要性和实现方法。 1. **核心概念**: - **权限**:...

    web系统权限设计书(内有详细数据库设计分析)

    本资料集“web系统权限设计书”深入探讨了这一主题,提供了详细的数据库设计分析,旨在帮助开发者和系统架构师理解并实施有效的权限管理和角色控制策略。以下是核心知识点的详细说明: 1. **权限与角色概念**: - ...

    JAVA普遍使用的权限设计

    在Java中,权限设计是构建安全、高效的企业级应用不可或缺的部分。本文主要探讨了OA系统中普遍采用的权限管理设计方案,旨在提供一种灵活、可扩展的权限控制机制,以适应不同规模企业的实际需求。 首先,权限设计的...

    系统权限设计详解.doc

    本文将深入探讨权限设计的基本原则、实现方式以及数据库结构设计。 1. **权限分配策略**: - **基于角色的权限分配**:不同职责的人员对应不同的权限。通过创建“组”或“角色”,将具有相似权限的用户归类,然后...

    通用权限设计文档讲解

    通用权限设计文档主要探讨了如何构建一个适用于多种应用系统的权限管理体系,旨在避免重复设计和提高效率。该系统的核心目标是对所有资源进行权限控制,包括用户权限分配、功能添加及权限操控。 1. **权限资源**:...

    C#开发权限设计及应用

    本篇将详细探讨C#开发中的权限设计及应用,结合提供的源码,我们将深入理解如何实现一个完整的权限管理系统。 首先,权限设计主要涉及用户、角色和权限三个关键概念。用户是系统的使用者,角色是权限的集合,而权限...

    登入角色用户权限设计代码.

    本文通过对“登入角色用户权限设计代码”的详细解析,不仅介绍了登录功能的实现原理,还探讨了用户验证流程以及权限控制的设计思路。这种分层架构的方法使得代码结构清晰、易于维护。在实际项目开发过程中,还需要...

    OA系统权限设计数据库实现.zip

    本文将详细探讨如何通过数据库技术来实现OA系统的权限设计,特别是使用Java编程语言进行实现。 首先,权限设计是OA系统中至关重要的部分,它涉及到用户角色、资源访问控制以及操作权限等多个方面。在数据库层面,...

    Asp.net中的用户角色权限设计

    下面将详细探讨Asp.net中实现用户角色权限设计的核心概念、技术和最佳实践。 首先,Asp.net提供了一个内置的安全框架,包括身份验证(Authentication)和授权(Authorization)两部分。身份验证用于确认用户身份,...

    权限设计代码

    本文将深入探讨“权限设计代码”的核心概念,主要围绕用户、角色、权限和资源这四个关键元素,并以Java的Shiro框架为例进行详细阐述。 首先,用户是系统的操作者,他们具有不同的职责和操作需求。在权限设计中,每...

    应用程序系统中权限的设计——数据库设计

    本文将详细探讨几种常见的权限设计方法及其优化。 1. **基于角色的权限设计**:这是最常见的权限设计方式,用户权限与其所属的角色关联。每个角色被赋予一组特定的操作权限,程序在运行时根据用户的角色来判断其...

    权限设计 打包(5个文档、教程)

    这个打包的资源包含了五个相关的文档和教程,旨在深入探讨权限设计的相关概念和技术。以下是这些文件所涵盖的主要知识点: 1. **java用户角色权限设计.doc**: 这个文档可能涉及到Java编程语言中的权限控制机制,...

Global site tag (gtag.js) - Google Analytics