`
zjut_xiongfeng
  • 浏览: 280136 次
  • 性别: 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,抱歉) 
欢迎朋友们和我联系,mailto:berg@91search.com,也欢迎访问我和另外一位朋友共同建设的网站:http://www.91search.com,那里将有一个音乐搜索的工具软件提供下载。

 
========================================
关于权限包容关系通过角色和权限掩码来实现。
 /// <summary>
 /// 权限保护类型枚举类型。
 /// </summary>
 public enum ProtectEnum
 {
  /// <summary>撤回权限保护类型</summary>
  RevokeProtect = 0,
  /// <summary>授予权限保护类型</summary>
  GrantProtect = 1,
  /// <summary>拒绝权限保护类型</summary>
  DenyProtect  = 2
 }

 

 /// <summary>
 /// 系统固定用户或角色枚举类型。
 /// </summary>
 /// <remarks>
 /// 管理员角色:16399 = 100000000001111
 /// 所有者角色:16385 = 100000000000001
 /// 只读者角色:16386 = 100000000000010
 /// 安全员角色:16388 = 100000000000100
 /// 配置员角色:16392 = 100000000001000
 /// </remarks>
 public enum FixedRoleEnum
 {
  ///<summary>系统管理员固定用户</summary>
  Administrator = 1,
  ///<summary>系统管理员固定角色</summary>
  Administrators = 16399,
  ///<summary>所有者固定角色(具有读写操作之权限)</summary>
  Authors  = 16385,
  ///<summary>只读者固定角色(具有只读操作之权限)</summary>
  Readers  = 16386,
  ///<summary>系统 安全管理 员固定角色</summary>
  Security = 16388,
  ///<summary>系统设置管理员固定角色</summary>
  Setting  = 16392
 }
 /// <summary>
 /// 系统权限枚举类型。
 /// </summary>
 public enum PermissionEnum
 {
  /// <summary>“读取”权限</summary>
  FetchPermission = 1,
  /// <summary>“新增”权限</summary>
  AddNewPermission = 2,
  /// <summary>“更新”权限</summary>
  UpdatePermission = 4,
  /// <summary>“删除”权限</summary>
  DeletePermission = 8,
  /// <summary>“打印”权限</summary>
  PrintPermission = 16,
  /// <summary>系统保留,应用于流程处理</summary>
  FlowPermission = 1024,
  /// <summary>系统保留,应用于流程处理</summary>
  VoidPermission = 2048
 }
如果用户“Popeye”对“销售出仓单[2009]”系统对象具有读写(读取+修改+删除+新增)权限:(权限表定义如下TPermission)
FormID       UID           Permission
=======      ====          ==========
2009         Popeye        1+2+4+8=15
***** 上面系统定义的默认权限肯定是不够系统使用的,那么还有一些权限(例如:报关系统中的“计算差异表”“制造申报单”等权限,就由系统再定义),其实不用太担心会不够用的,因为在一个Form中不可能会出现所有权限情况,所以,系统自定义的权限掩码可重复使用在不同的表单中。*****
  建议不要把角色和用户分开两张表来存储(可参考MS-SQL Server中的sys_users表),因为在后面的权限定义表需要引用这个表的UID(其可为用户或角色,SQL中是使用UID的数值范围来区别用户与角色的,建议也如此。),版主说的角色与用户分开对待 权限设置 ,这点我不赞成。因为角色只不过是一种用户组,其应该享用用户的权限定义范围,在其下属的角色成员(注意角色成员不同于用户或角色哦,其可以为角色也可以为用户)均默认继承其定义的权限,除非角色成员重新指派其上级角色定义的权限字。下面给出我的相关表定义:
TUser(用户或角色表)
===================
(PK)UID   int              NOT NULL(主键)
Name      nvarchar(50)     NOT NULL(唯一性约束)
FullName  nvarchar(100)    NULL
Description   nvarchar(255)  NULL
MasterNo  varchar(25)     NULL(注:该字段对应为员工表中的员工编号,通过该字段就可以关联知道该用户或角色所属的员工了,在企业 管理系统 中很有用啊!)
TMember(用户与角色关系表)
=========================
(*PK)RoleID    int   NOT NULL
(*PK)UserID    int   NOT NULL
TPermission(用户权限表)
=======================
(*PK)FormID    int   NOT NULL(表示系统中各个模块或表单的唯一编号)
(*PK)UserID    int   NOT NULL(用户或角色编号)
Protect        bit   NOT NULL(1:表示显示授予权限;0:表示显示拒绝权限)
Permission     int   NOT NULL(权限掩码和)
***** 如果哪位兄弟有意研究权限与流程定制方面的东东,相信找偶是没错的了!!!呵呵~~~    老板,给分啊~~~~~×××××


==========================================
以上的方法与我做的项目的方法基本一致,现摘一部分的表结构,以供大家参考
create table t_workelement /*工作元素表*/
(
 code varchar(20) not null, /*元素的代码,唯一*/
 name varchar(50)  not null UNIQUE,/*元素的名称,唯一*/
 type int  not null, /*类型 0-单据操作 1-报表操作 2-功能操作*/
 bcode varchar(20) null,  /*对应操作的单据\报表\功能的代码*/
 style int  null,  /*单据:类型 0-

分享到:
评论

相关推荐

    关于权限设计的探讨.pdf

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

    权限设计原理(原创)

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

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

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

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

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

    权限设计原理

    《权限设计原理》一书中详细探讨了这一主题。首先,书中介绍了权限设计概要,包括前言、目标和现状。前言部分可能阐述了权限设计的重要性,目标可能指明了设计权限系统要达到的效果,如保护敏感信息,确保操作合规,...

    java用户权限设计

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

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

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

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

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

    权限设计VSD

    下面我们将深入探讨权限设计的核心概念、重要性和实现方法。 1. **核心概念**: - **权限**:权限定义了用户可以执行的操作,如读取、写入、删除、修改等。 - **角色**:角色是一组预定义的权限集合,用户通过被...

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

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

    JAVA普遍使用的权限设计

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

    系统权限设计详解.doc

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

    通用权限设计文档讲解

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

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

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

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

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

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

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

    C#开发权限设计及应用

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

    权限设计代码

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

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

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

    菜单权限设计

    在IT行业中,菜单权限设计是构建用户界面和管理系统时至关重要的一环。它涉及到如何有效地组织应用功能,并确保用户只能访问他们被授权的操作。这既提高了用户体验,也保障了系统安全。接下来,我们将深入探讨菜单...

Global site tag (gtag.js) - Google Analytics