关于权限设计的探讨

关于权限设计的探讨(寻求数据库设计者和开发人员的帮助)

zealberg ( 冰山一级用户 该版得分小于等于100分    2003-04-13 09:20:35 在  企业开发 /  企业信息化 提问

关于权限设计的探讨    
   
   
  但凡涉及多用户不同权限的网络或者单机程序,都会有权限管理的问题,比较突出的是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,那里将有一个音乐搜索的工具软件提供下载。  
 
问题点数: 100、回复次数: 120
1楼  zealberg   ( 冰山) 一级用户 该版得分小于等于100分  回复于  2003-04-13 09:21:27  得分 0

另外,有朋友提到:  
   
  权限设计需求:  
  1、用以实现对界面对象(如菜单、按钮)的权限控制。简称对象级权限  
  2、用以实现对数据能否被某一个用户修改、删除的权限控制。建成数据级权限  
   
  对象级权限基本上大家都实现过,数据级权限比较特殊,它能够实现数据的权限分配  
  例如:A用户可以将其产生的数据分配给B用户修改,给C用户删除的权限。  
   
  数据级权限的要点就是要在表中增加一个字段用以保存数据所有者的用户标识。  
   
   
  我的想法是这样:  
   
  数据级权限的管理和对象权限有比较大的区别,它不容易使用一条语句精确的描述,Notes的做法是保存每个文档的所有者标识,在关系型数据库中也可以使用相同(或者类似)的办法解决,但情况要复杂一些。  
   
  如果要实现对单条数据的存取控制,恐怕只能用流程来实现,这种手段在OA系统中比较常见,比如将A写的某个公文文档移交给B审批,这时B获得的只是对所有者A某一个而不是所有文档的审批权限。虽然也是赋予了B某种权限,但事实上这不属于上文所讨论的权限管理范围,而只是业务流程。  
   
  但是我们考虑,在非公文流程的大部分系统中,只是简单的设定:用户B具有对所有者A的文档具有修改权限,而这种定义,是可以在上文描述的数据库进行描述并实现的。  
   
  事实上,在关系型数据库中,要对某个用户对表的存取权限精确到记录是不可能的,这只能在程序中使用聪明巧妙或者笨办法解决,当然,与之相关的是业务流程的设计。很多OA系统自称能自定义流程,大体也就是能通过巧妙的数据库设计,将流程运作的全过程记录在数据库中。  
   
  基于Lotus的OA系统理论上可以定义某个用户对某个文档的存取权限,但实际操作中,为了减轻开发人员的负担,都只是定义了角色对某个数据库的存取权限,而将剩下的内容交由前端控制,这和我们在ASP程序中习惯使用SA登录SQL   Server是一样的。  
   
  业务流程的实现方法本质上和操作权限无关,它将是另外一个讨论话题。  
   
  以上只是个人浅见,请大家批评指正!  
 
Top
15楼  SW515   ( 孙五) 一级用户 该版得分小于等于100分  回复于  2003-04-15 17:05:08  得分  40

关于权限包容关系通过角色和权限掩码来实现。  
   
  ///   <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(权限掩码和)  
   
  *****   如果哪位兄弟有意研究权限与流程定制方面的东东,相信找偶是没错的了!!!呵呵~~~         老板,给分啊~~~~~×××××
Top
19楼  eastliangliang   ( 青苹果:拒绝羊皮的狼) 一级用户 该版得分小于等于100分  回复于  2003-04-15 18:06:13  得分  10

苹果有一处不明:“角色/用户类型(布尔型字段,用来描述一条记录记录的是角色权限还是用户权限)”角色权限和用户权限分别是做什么用的,两者不一样么?  
  在我对权限的理解中,是用户属于某个角色,角色拥有一定的权限,一个用户对一个资源有没有操作权限,看的是他当前的所属角色是否有权限,所以我感觉用户权限和角色权限在这里是统一的,或者说只有角色权限,没有用户权限。  
  这六张表中,前五张和冰山兄定义的一样,第六张只有简单的一个角色ID和权限ID。我是做三层结构的,所有对数据库的操作都封装到了中间层,以中间层的业务对象提供的方法作为权限,每一个方法对应一个权限ID,在每个方法中都判断用户是否有这个权限。比如:删除回复的权限ID是1001,每次调用删除回复方法时,联合查询用户名,用户所属角色和权限ID是1001的记录,如果有此记录,则进行删除。现在看来有个缺点,我把限制内容,也就是资源ID硬编码到权限ID中了,而且权限ID被硬编码到程序中了,下次改进一下。  
  感觉三层和两层的权限设计还是有区别的,毕竟三层中数据库不会直接暴露给客户端。所说仅供参考。  
  给个网址参考,还有一篇姊妹篇,找不到啦  
  http://www.jdon.com:81/jive/article.jsp?forum=46&thread=4110&message=438816  
 
Top
29楼  linlexing   ( 拉拉叉) 一级用户 该版得分小于等于100分  回复于  2003-04-16 17:24:12  得分  10

以上的方法与我做的项目的方法基本一致,现摘一部分的表结构,以供大家参考  
  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-查看   1-新增   2-修改   3-删除*/  
  /*报表:无*/  
  /*功能:无*/  
  term ntext null, /*单据:查看/修改/删除时要符合的条件,如"{$承揽合同.编号}=12/n{$承揽合同.名称}<>'afd'"*/  
  primary   key(code)  
  )  
  go  
  drop   table   t_role  
  go  
  create   table   t_role   /*角色表*/  
  (  
  name varchar(30) not   null,  
  category   varchar(50) null,  
  remark varchar(100) null,  
  primary   key(name)  
  )  
  go  
  drop   table   t_roleelement  
  go  
  create   table   t_roleelement   /*角色元素操作表*/  
  (  
  rname varchar(30) not   null, /*角色名称*/  
  ecode varchar(20) not   null, /*元素的代码*/  
  primary   key(rname,ecode)  
  )  
  go  
  drop   table   t_users  
  go  
  create   table   t_users   /*用户表*/  
  (  
  name varchar(20) not   null, /*用户的名称*/  
  dcode varchar(20) not   null, /*所属的部门*/  
  category   varchar(50) null, /*用户的类别*/  
  pswd varchar(15) null, /*密码*/  
  primary   key(name)  
  )  
  go  
  /*插入系统管理员*/  
  INSERT   INTO   t_users  
  (  
  name,  
  dcode,  
  category,  
  pswd  
  )  
  VALUES  
  (  
  'Admini',  
  'system',  
  '超级用户',  
  ''  
  )  
  go  
  drop   table   t_userrole  
  go  
  create   table   t_userrole   /*用户角色表*/  
  (  
  uname varchar(20) not   null, /*用户名称*/  
  rname varchar(30) not   null, /*角色的名称*/  
  primary   key(uname,rname)  
  )  
  go  
  INSERT   INTO   t_userrole  
  (  
  uname,  
  rname  
  )  
  VALUES  
  (  
  'Admini',  
  '系统管理员'  
  )  
  go  
  drop   table   t_dept  
  go  
  create   table   t_dept   /*部门表*/  
  (  
  code varchar(20) not   null, /*部门的代码*/  
  name varchar(50) not   null   UNIQUE,/*部门的名称*/  
  type varchar(10) null, /*部门的类别   行政   仓库   车间*/  
  subtype varchar(16) null, /*子类别   成品仓库   原料仓库自定义*/  
  primary   key(code)  
  )  
  go  
  /*插入系统管理部*/  
  INSERT   INTO   t_dept  
  (  
  code,  
  name,  
  type  
  )  
  VALUES  
  (  
  'system',  
  '系统管理部',  
  '行政'  
  )  
  go  
 
Top
30楼  SW515   ( 孙五) 一级用户 该版得分小于等于100分  回复于  2003-04-16 17:27:49  得分 0

回复人:   xiaocon(小葱)   (   )   信誉:100    
  *****************************************  
  能给点思路吗?没用过Lotus   Notes,我上面说的只是一个列子,还有比如记录是A建立的,一旦建立之后,可能就由B管理了(或者A与B二个人都可以管理),而如果以后B离开了,由C(或   A与C)管理了,这样的权限如何处理?  
  ========================================================================  
  这个其实是一种所谓角色转移的东东,如果要程序自动来处理的话,有几点概念性的问题要搞清楚:1、什么叫做某用户离开了???2、如何鉴别“离开”这个事件?!!!3、由谁来激发这个用户“离开”事件????4、后继角色或用户如何自动接管离开角色或用户的权限?!!最后还有一点,如果离开的那个用户又突然杀个回马枪,他又该如何收回其权限,并且接受用户或角色如何放手呢???   呵呵……   看来,这个问题不简单啊~   我无意使问题复杂化,也不想打击xiaocon(小葱)兄的信息,只是想提醒一下,如果要想把东西做好绝不是简单的事情,前期的设计比什么都重要啊!!!!呜呜~~~  
  我有个“野蛮”的招,就是人工来做。比如说A用户“离开”了,业务经理(反正不是我)就打个电话给系统权限管理员,告诉他把A用户的流程权限加入到继承者B和C的门下~~呵呵,这样也算一种解决方案罢~~   笨是笨点,但是还是可以解决实际问题的~~~  
  呵呵……   闪~
Top
31楼  SW515   ( 孙五) 一级用户 该版得分小于等于100分  回复于  2003-04-16 17:27:50  得分 0

回复人:   xiaocon(小葱)   (   )   信誉:100    
  *****************************************  
  能给点思路吗?没用过Lotus   Notes,我上面说的只是一个列子,还有比如记录是A建立的,一旦建立之后,可能就由B管理了(或者A与B二个人都可以管理),而如果以后B离开了,由C(或   A与C)管理了,这样的权限如何处理?  
  ========================================================================  
  这个其实是一种所谓角色转移的东东,如果要程序自动来处理的话,有几点概念性的问题要搞清楚:1、什么叫做某用户离开了???2、如何鉴别“离开”这个事件?!!!3、由谁来激发这个用户“离开”事件????4、后继角色或用户如何自动接管离开角色或用户的权限?!!最后还有一点,如果离开的那个用户又突然杀个回马枪,他又该如何收回其权限,并且接受用户或角色如何放手呢???   呵呵……   看来,这个问题不简单啊~   我无意使问题复杂化,也不想打击xiaocon(小葱)兄的信息,只是想提醒一下,如果要想把东西做好绝不是简单的事情,前期的设计比什么都重要啊!!!!呜呜~~~  
  我有个“野蛮”的招,就是人工来做。比如说A用户“离开”了,业务经理(反正不是我)就打个电话给系统权限管理员,告诉他把A用户的流程权限加入到继承者B和C的门下~~呵呵,这样也算一种解决方案罢~~   笨是笨点,但是还是可以解决实际问题的~~~  
  呵呵……   闪~
Top
33楼  zealberg   ( 冰山) 一级用户 该版得分小于等于100分  回复于  2003-04-16 20:06:23  得分 0

to:   Power_X3q(人海沉浮)    
     
      根据我参加多个系统涉及权限的设计,我总结了一套权限设计方案,在目前所有的权限设计当中,权限控制主要分为两个方面:1。你是否能够看到这个菜单功能;2。你是否能够处理这个菜单设计的事务功能(相对比较复杂,有按照微软的授权方式:完全控制,读,写,删除,管理……),现在大部分系统都是用菜单来控制权限的(绝大部分时候是够用了),但是我们还增加了一个基于流程事务功能上的授权。  
   
  主要有:人员表,角色表,部门表   ,   级别表   菜单表  
            人员角色关系表         部门角色关系表               人员部门关系表  
            人员菜单表,             角色菜单表,            
   
      另外还有一套工作流程授权机制表,基本上能够控制得非常理想!  
       
  …………………………………………………………………………………………………………  
   
  在不同的系统中,权限设计当然可以使用不同的策略,基于菜单+流程的办法对于大多数的OA系统而言,应该是足够的。很多小型的MIS系统,甚至只使用菜单就能实现权限管理,根本没必要弄得很麻烦。  
  我提及的权限设计方案本质上是针对中等规模的MIS、ERP系统的,所以没有太多考虑OA系统中的流程因素。当然,要付诸实用并具有一定的通用性,还需要结合实际的案例加以改进。
Top
34楼  zealberg   ( 冰山) 一级用户 该版得分小于等于100分  回复于  2003-04-16 20:19:43  得分 0

To:   litsnake1(litsnake)    
     
      to   pray1997(pray1997)   (   )   :  
  怎么样用数字组成字符串来表示啊,  
          1。你是怎么解决权限的包容关系的  
          2。你们是怎么解决人员的多角色的问题,例如:一个员工既是财务总监又是经理,就是又多种角色的人,你们是怎么解决权限问题  
   
  谢谢!!!!!!  
   
     
  ………………………………………………………………………………………………  
   
  这个问题我考虑了一下,也借鉴了一些BBS管理帖子层次的设计方法,如下:    
   
  假定录入操作的权限ID为1,浏览操作的权限ID为2,修改操作的权限ID为3,删除操作的权限ID为4  
  同时假定修改操作包括了浏览操作权限,删除操作包括了修改操作的权限  
   
  在表5(权限列表)中加入一个字段:权限值  
   
  那么可以设定:录入操作的权限值为1,浏览操作的权限值为2,修改操作的权限值为32,删除操作的权限值为432,这样就解决了权限包容关系  
   
  同时我们规定,各权限描述数据在表6(权限-角色-用户对应表)中存储的数据为权限值的简单累加  
   
  这样,当我们读到某用户对库存表的权限为1432(即拥有录入、删除权限)时,如果要判断他是否具有浏览权限,只要简单的查找到该字符串中是否有2便可,这种情况下,权限代码1432和12432,1232432表示的意思是一样的,读取的方式也相同。
Top
37楼  zealberg   ( 冰山) 一级用户 该版得分小于等于100分  回复于  2003-04-16 21:00:30  得分 0

To:   eastliangliang(青苹果)(道可道,非常道)    
   
  苹果有一处不明:“角色/用户类型(布尔型字段,用来描述一条记录记录的是角色权限还是用户权限)”角色权限和用户权限分别是做什么用的,两者不一样么?  
  在我对权限的理解中,是用户属于某个角色,角色拥有一定的权限,一个用户对一个资源有没有操作权限,看的是他当前的所属角色是否有权限,所以我感觉用户权限和角色权限在这里是统一的,或者说只有角色权限,没有用户权限。  
   
  ………………………………………………………………………………………………………………  
   
  用户是属于某个或多个角色的,例如,销售部主管通常也可以普通销售的身份进入系统,但他具有其它方面如统计的权限,比如说所有销售人员的营业额进行统计。  
   
  你可能会说,单独定义一个销售部主管的角色不就行了?但事实上,用户具有多重身份的情况是很常见的,如果某个财务人员也兼职做销售,呵呵,麻烦就大了。所以通常需要考虑用户属于多个角色的可能性。  
   
  另外,在公司的实际运行过程中,某个用户可能会具有本身所属角色组以外的权限,还拿刚才说的销售部主管为例子,如果我们没有将销售部主管定义为单独的角色,而只有销售人员这个角色,而总经理有统计所有销售人员营业额的权限,当然,他还有另外的权限。当我们要定义某个销售人员是销售主管时,只需要将他的权限加上一条“允许对所有销售人员的营业额进行统计”就够了。  
   
  关于对某个用户禁止某项权限,思路也是一样的。
Top
38楼  zealberg   ( 冰山) 一级用户 该版得分小于等于100分  回复于  2003-04-16 21:14:43  得分 0

To:   SW515(孙五)    
   
  这个其实是一种所谓角色转移的东东,如果要程序自动来处理的话,有几点概念性的问题要搞清楚:1、什么叫做某用户离开了???2、如何鉴别“离开”这个事件?!!!3、由谁来激发这个用户“离开”事件????4、后继角色或用户如何自动接管离开角色或用户的权限?!!最后还有一点,如果离开的那个用户又突然杀个回马枪,他又该如何收回其权限,并且接受用户或角色如何放手呢???   呵呵……   看来,这个问题不简单啊~   我无意使问题复杂化,也不想打击xiaocon(小葱)兄的信息,只是想提醒一下,如果要想把东西做好绝不是简单的事情,前期的设计比什么都重要啊!!!!呜呜~~~  
  我有个“野蛮”的招,就是人工来做。比如说A用户“离开”了,业务经理(反正不是我)就打个电话给系统权限管理员,告诉他把A用户的流程权限加入到继承者B和C的门下~~呵呵,这样也算一种解决方案罢~~   笨是笨点,但是还是可以解决实际问题的~~~  
  呵呵……   闪~  
   
   
  ……………………………………………………………………………………………………………………  
   
  这玩意和电话的呼叫转移差不多,电话使用的办法是向电信局申报,我们也可以这样解决……  
   
  打电话是一种办法,发个短信也行啊……于是可以设计一个这样的模块:根据用户的请求自动更改相应权限,想想应该是不复杂的,只是好像需要在程序中写死……  
   
  对了,突然想起,呼叫转移还有一个功能:无人应答转移,这个就不好弄了,比如规定“A三天内未审批该文档则自动转交到B”,不容易判断“三天”这个日期,自动触发……,高手们想想办法  
 
Top
44楼  clacklin   ( 海风) 一级用户 该版得分小于等于100分  回复于  2003-04-17 11:47:39  得分  5

路过中…………上面的我没细看,下次再仔细看看。下面是我的一点见解。  
   
  在现实中,权限控制包括一个用户所担任岗位、角色,岗位与角色的有点区别。岗位是专门负责某方面的一个角色,如:一个局下面有好几个分局,相应的设立了多个分局长,这个“分局长”就是角色,岗位就是:××局分局长。这样,某个岗位的人看到的数据就与别的岗位的应该有所区别。这就是xiaocon(小葱)所说的“  
  如果涉及到对记录行的管理呢?如何做?  
  比如有一个仓库管理软件,产品有好多种,A可能管理办公用品的,B可能管理电子产品的,那么A不能处理和查看B的记录,这种权限如何实现?”  
  也就是说,A与B的岗位责任区不一样。这里就新提出一个责任区的概念。责任区与人无关,只与岗位有关系。所以:岗位=角色+责任区。而角色权限控制是对该角色能对哪些程序业务模块进行操作的控制。只要对一个用户赋于特定的岗位(当然是可以多个岗位的),就可以控制该用户的系统功能使用权限、数据查询范围。  
   
  这样新的需要也就出来了,不同岗位的人使用同一模块时,所拥有的权限是不一样的。(这里先假设该模块有如下功能:增加删除修改提交审批查询)这也是上面大家所说的对象权限。根据我这里所实现的整个权限体系,可以自由配置某个角色对某模块里某个表的对象权限;可以自由配置该模块哪个字段是否只读。这样,在一个流程里,只需做一个模块,就可以让不同的岗位的人进行相应的数据流操作:开单人只能进行开单、提交,审核人只能进行审核、提交、退单,不能删除修改。其它的流程控制就不属于这里所讨论范围了。(具体如何实现请不要问我了,我现在难得上一次CSDN的)  
   
  这样,权限控制能做到对象级、数据级、字段级。所有的控制全部可以由系统管理员进行配置,程序开发时不必针对不同的权限要求来另外开发相应的模块。  
   
  (讲得很零乱,大家别见怪:P)  
 
Top
71楼  zealberg   ( 冰山) 一级用户 该版得分小于等于100分  回复于  2003-04-21 16:16:41  得分 0

To:   hpretty(阿飞)    
     
      楼主说用素数,我觉得还不如用一个bit表示你的权限,解析起来简单,位数也是有足够的空间  
  32位整数就有31位可用,足够了吧!  
  1000,0000,0000,0000,0000,0000,0000,0000表示查看  
  0100,0000,0000,0000,0000,0000,0000,0000表示插入  
  0010,0000,0000,0000,0000,0000,0000,0000表示修改  
  .....  
  看是不是有这个权限  
  拿这个数同你取出来的数一   & 不就知道了吗?  
  为什么用素数,还分解因子什么的,太麻烦了吧!  
   
  ……………………………………………………………………………………………………  
   
  我仔细考虑了你的想法,近日看了Google对命中列表(Hit   Lists)数据压缩存储的方式,感觉使用素数是不合情理的方法,当然,对于权限限制内容较少的系统,也是可以用该方法解决的,它的复杂性比位操作要简单一些(分解因子的工作量其实很小,因为权限代码的因子一定包含在基本标志码列表中,只要照着除就可以了)。  
   
  但本人以为,字符串和位操作两者的实现本质上是一样的,关键在于对空间的占用和对于位操作的复杂性之间的权衡,考虑到通常MIS系统对空间占用要求不高,并且权限限制内容本身很少,用不了几个字节的地方,所以,通常情况下,还是使用字符串的好,它简要明了、操作简单,实现的具体方式可以参看前面我给litsnake1(litsnake)兄弟的回复。
Top
87楼  zealberg   ( 冰山) 一级用户 该版得分小于等于100分  回复于  2003-04-24 15:32:05  得分 0

To:   events(兵马俑)    
       
  不知道各位有没有使用过win2000的AD   Server来结合MIS设计权限部分的管理呢?  
   
  ……………………………………………………………………………………………………  
   
  这个问题bucher先生的做法是:  
   
  我说一个与数据库无关的安全解决方案  
  我是一个比较喜欢偷懒的人,写过一套类似于楼主所说的权限系统,但是发觉在用户组的权限继承方面存在一个极大的麻烦,而当用户同时属于两个组的时候,权限的交集计算非常麻烦。还有权限的委派和用户权限的临时提升也是一个很烦人的事情。于是就放弃了那套系统。  
  我发觉Windows2000的AD权限系统非常不错,于是动起了这个脑筋,最后发掘“组策略”可以实现我的想法。组策略支持继承和权限交集,而且使用也非常方便。于是研究了一下其2次开发原理,使用了注册表策略实现了我公司MIS系统的权限,可以控制到任意应用程序角度(完全取决于软件开发者),而且配置相当方便(使用AD的用户、用户组管理器)。  
  其实AD的注册表策略非常简单,充其量就是其用户权限的延伸,我们自定义了新的权限。AD负责对其进行管理和计算,然后把最终的结果写入用户计算机的注册表的一个受保护的段内。该内容对于用户只读。对于客户端程序,只需要判断注册表的键值即可。  
   
  其实注册表策略是一个非常简单的权限系统,唯一要做的就是写一个配置文件告诉  
  AD需要写入那些注册表项。在客户端只要一个小小的DLL用于读取这段注册表数据  
  即可。  
  你可以再Windows2000   server   的帮助文件中搜索“创建自定义   .adm   文件”,相  
  信可以给你一些启发。      
   
   
  ………………………………………………………………………………………………………………  
   
  我看了.adm文件的写法,也看了一下MMC程序的特征,解决方案确实不错,值得借鉴!
Top
94楼  pray1997   ( pray1997) 一级用户 该版得分小于等于100分  回复于  2003-04-25 16:03:54  得分 0

To:   litsnake1(litsnake)    
     
      to   pray1997(pray1997)   (   )   :  
  怎么样用数字组成字符串来表示啊,  
          1。你是怎么解决权限的包容关系的  
          2。你们是怎么解决人员的多角色的问题,例如:一个员工既是财务总监又是经理,就是又多种角色的人,你们是怎么解决权限问题  
   
  谢谢!!!!!!  
   
   
   
  我的意思其实很简单,用一组字符串表示具体的权限,该字符串的组成譬如如下:  
  全部由数字组成,每两位数字表示一组权限时,则每组最多能包容7种权限(2^8=64),以及99-63=36个可扩展数字,(每组3位数字时有8种权限,以此类推)。那么所谓的权限包容,比如说权限值为0100表示可读,0200表示可写,操作人员权限值为0600,那么因为1&6=0,所以该人员没有读的权限,但是2&6=2,故该人员有写的权限,如果是0300,则即可读也写  
   
  至于所谓的角色,说到底其实还是权限的问题,一个角色其实可以具体表示为一个权限值,多个角色之间的所包含的权限或许有重复,但不同角色本身的权限值是不会相同的,具有多种角色的人员,它的权限其实就是每个角色的权限值相或所得的结果。  
   
  不知这么说对不对,请指教  
   
   
 
Top
97楼  zealberg   ( 冰山) 一级用户 该版得分小于等于100分  回复于  2003-04-25 18:12:50  得分 0

To:   Lewolf(李狼)    
     
  “权限有这么难吗?也许我没有碰到过最复杂的问题,不过在通常的程序中,我是采用“位”表示相应权限的,一个整型32位,组合起来一共可以表示4个G的权限分类,不过大多数权限是相互制约的,正向前面所说的,修改权就制约着必须拥有浏览权,角色实际上是将一系列预先设置权限组(通常是比较常用的)定义成一个新的描述对象,其划分遵循一定的规则,比如允许一个用户同时处于不同的角色,角色和分离的权限之间有较好的约束关系。这并没有什么难作的。”  
   
  我想你并没有说出解决任何实际问题的办法,“我是采用“位”表示相应权限的,一个整型32位,组合起来一共可以表示4个G的权限分类”,还不如说32位整形数总共有4G个,似乎更能让人明白。对于你们这等高手来说,“这并没有什么难作的。”,而我们刚入门,没办法了,只好就着简单问题翻过来覆过去的讨论。  
   
   
   
   
  “在界面上,也很简单,权限实际上要严格的和界面元素的状态对应,甚至需要在操作中对权限进行检验,将一些复杂的逻辑关系通过化简,可以转换成若干简单逻辑关系,这些简单逻辑关系可以更好的使用计算机语言来表示,让每一个逻辑单元的状态只和直接相关的状态发生关系,就可以非常容易的设计出很少有Bug的程序。在C++   Builder中可以使用属性来实现,这种设计方法称作以状态为核心的设计方法。比UML中状态机的机制应该更先进一些!”  
       
  我想,权限设计的难点在于设计时需要考虑到实现的复杂程度,也就是应用程序接口实现和界面表示的复杂性,在设计数据库时,必须充分考虑这两点。泛泛而谈“权限实际上要严格的和界面元素的状态对应”可能是高手们的做法,至于将复杂的逻辑关系化简,自然是面向过程设计的基本功,五年前我学C的时候看见过的。  
   
  我不知道C++   Builder是怎么实现的,也不明白“状态机”是个什么样的机制,至于怎样非常容易的就能设计出很少有Bug的程序,确实很少人能掌握,太高深!多谢指点!
Top
113楼  Brilliant_DZQ   ( 一夜未眠) 一级用户 该版得分小于等于100分  回复于  2003-08-03 02:02:26  得分 0

前段时间参考HARVEST的思路,写了个权限控制的框架,java写的,也和大家交流下。  
  分为几个概念:  
  1.User——用户  
  2.UserGroup——用户组  
  3.Permission——权限项  
  4.Project——项目  
  5.State——状态,一个项目可有n个状态组成  
  6.Process——处理项,从属于State,即一个State中可进行多种处理  
  7.Role——用户角色  
        权限方面的思路就是将State与Role绑定,将User加入到Role中,通过Role-State  
  关系判断用户是否有进入State操作Process的权限。  
        因为设计出发点是一个便于开发的框架,所以开发的过程大致是这样的:  
  a.分析业务需求,用一个Project进行描述  
  b.将Project的完成分成几个步骤,每个步骤对应一个State  
  c.确定每个State有哪些处理要求,构建Process  
  d.分析用户权限,定义Role,并为每个State确定Role-State关系  
  e.将User加入Role  
        也许有网友认为Role的功能与UserGroup重复,而Permission没有使用到。我的考虑  
  是这样的:  
        实施HARVEST时,我曾遇到这样一个问题,HARVEST将使用者分为管理员和用户两类,  
  用户可通过设定角色无穷分类,而管理员确无法细化。为此我认为在角色之上,应该从  
  系统级上进行一个用户分类,即UserGroup。UserGroup是系统识别的,对用户透明。  
  Permission的考虑也类似,Permision与User、UserGroup都可建立联系,目的在于让系  
  统在方法调用时可判断识别,一般我用facade模式构建一个个模块,模块入口类统一控  
  制Permission。这样的设计是为了使用户在定义权限时简单化,只要定义将不同的User  
  加入到不同的Role就行,同时也避免系统因为用户权限使用的过于简单,导致系统级权  
  限管理的弱化。  
          该框架我主要考虑的是工作流类型的开发,欢迎大家交流,可mail至dzq1979@263.net
Top
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值