1+1=2,0+0=0

日月累积
posts - 7, comments - 50, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
      首先上文权限设计拙见(1)中只是想记录下自己权限设计上的一点看法,以及将自己日常最常用的权限解决方案记录下来以供日后回顾,没想到有朋友关注此类的设计,那就只能先把代码拿出来献丑了,抛砖引玉,大家共同探讨学习
      接着上文来说,上文所讨论的权限设计是一条思路,但既然是web应用,少不了数据库的支持,本文我们来讨论一下数据库的设计。(以下想法及思路仅仅代表本人拙见)
      说到权限的数据库设计,必先理清权限中几种实体及其关系,此部分想必有过设计权限经验的同仁都知道怎么设计了,网上摆渡一下也是一裤衩子一裤衩子的,我们就在最平凡直观的数据库关系的基础上来建立权限。下面是我的几个表(所有的表都带有一个pk_id,作为表的自动生成的唯一主键):
用户表(T_UserInfo):
 1/*==============================================================*/
 2/* Table: T_UserInfo                                            */
 3/*==============================================================*/
 4create table T_UserInfo 
 5(
 6    pk_id                NUMBER                         not null,
 7    name                 VARCHAR2(20),
 8    sex                  BOOLEAN,
 9    age                  int,
10    emp_num              NUMBER,
11    polity               int,
12    unit                 VARCHAR2(50),
13    department           VARCHAR2(20),
14    specialty            int,
15    position             VARCHAR2(10),
16    offtel               VARCHAR2(20),
17    famtel               VARCHAR2(20),
18    post_state           VARCHAR2(10),
19    remark               VARCHAR2(100),
20    constraint PK_T_USERINFO primary key (pk_id)
21);
用户表就不多说了,都是一些常用字段,年龄、电话、职位等,建议大家建立一个通用一些,字段多一些的一个用户表,便于以后扩展,以后如果有特殊需求,不用扩这个基本表,可以通过主外键关系来新建一个表,用于扩充字段
角色表(T_RoleInfo):
 1/*==============================================================*/
 2/* Table: T_RoleInfo                                            */
 3/*==============================================================*/
 4create table T_RoleInfo 
 5(
 6    pk_id                number                         not null,
 7    role_name            VARCHAR2(20),
 8    role_desc            VARCHAR2(100),
 9    parent_role_id       NUMBER,
10    constraint PK_T_ROLEINFO primary key (pk_id)
11);
角色表中需要说明的就一个parent_role_id父角色id,此字段用来扩展角色的继承关系。
资源表(T_ResourceInfo):
 1/*==============================================================*/
 2/* Table: T_ResourceInfo                                        */
 3/*==============================================================*/
 4create table T_ResourceInfo 
 5(
 6    pk_id                NUMBER                         not null,
 7    module_name          VARCHAR2(20),
 8    module_code          VARCHAR2(10),
 9    module_desc          VARCHAR2(100),
10    privilege_name       VARCHAR2(10),
11    privilege_code       CHAR,
12    privilege_desc       VARCHAR2(100),
13    constraint PK_T_RESOURCEINFO primary key (pk_id)
14);
15
这个表需要说明的就比较多了,首先该表用来记录资源与资源权限,我这边所谓的资源就是实体,就是数据库表,角色需要对应到资源,有些角色对该资源有权限,有些角色则对该资源无权限,角色可对此资源操作的权限也不同。说白了,就是不同的角色对不同的数据库表的操作权限不同。因此我们这里的资源就是数据库表。
module_name:资源名;module_code:资源代码(存放数据库表名);
privilege_name:权限名;privilege_code:权限代码(代表权限的code,也就是我们上文所说的权值)
例如角色a对数据库表T_UserInfo有添加与删除的权限则该表应该按照如下配置:
module_name:人员信息;
module_code:T_UserInfo
privilege_name:添加与删除
privilege_code:6
这里我们假设的是2的0次方为添加权限,2的1次方为添加权限,2的2次方为删除权限,2的3次方为更新权限,则拥有添加与删除权限就应该为2的1次方+2的2次方=6,其实2的几次方代表什么含义我们可以另外开个数据库表来配置(或者xml文件)此处我们忽略这些步骤。当然如果你的权限较多,譬如你还希望a这个角色对人员信息表有上传得权限,我们可以将将上传权限定义为2的4次方,16,16的16进制数为10,记录在数据库里的形式应该为0x10如果a角色拥有添加、删除、更新、上传权限,则a的权值应该为2的1次方+2的2次方+2的3次方+2的4次方=30,用16进制来表示就应该为0x1E,记录16进制数据,你不用担心位数不够。
剩余的就是几张关系表了:
人员角色关系表(T_R_User_Role):
 1/*==============================================================*/
 2/* Table: T_R_user_role                                         */
 3/*==============================================================*/
 4create table T_R_user_role 
 5(
 6    pk_id                NUMBER                         not null,
 7    user_id              NUMBER,
 8    role_id              NUMBER,
 9    constraint PK_T_R_USER_ROLE primary key (pk_id)
10);
11
角色资源关系表(T_R_Role_Resource)
 1/*==============================================================*/
 2/* Table: T_R_role_resource                                     */
 3/*==============================================================*/
 4create table T_R_role_resource 
 5(
 6    pk_id                NUMBER                         not null,
 7    role_id              NUMBER,
 8    res_id               NUMBER,
 9    constraint PK_T_R_ROLE_RESOURCE primary key (pk_id)
10);
11
当然如果你不怕麻烦,可以添加进去组(group)、系统(system)、组织(organization),建立起一套属于你自己的完整的权限解决方案,作为系统无关的模块去套用到每个你所架构的应用中去,那是一件极爽的事情。
连续剧开始了,暂时搁笔~~

评论

# re: web开发中的权限设计拙见一二(2) ----数据库设计  回复  更多评论   

2007-01-03 05:13 by lang
早上起来就看了半天这个,期待着进一步的代码和讲解!

# re: web开发中的权限设计拙见一二(2) ----数据库设计  回复  更多评论   

2007-01-03 13:11 by 江上一叶舟
呵呵,我刚起床,下面就发布代码,如果不结合代码,看这样的数据库设计或许会很疑惑难懂

# re: web开发中的权限设计拙见一二(2) ----数据库设计  回复  更多评论   

2007-01-03 16:35 by coder
不是我打击你,这个设计太简陋了

# re: web开发中的权限设计拙见一二(2) ----数据库设计  回复  更多评论   

2007-01-03 16:59 by 江上一叶舟
@coder
在上文中我提及到:“可以添加进去组(group)、系统(system)、组织(organization),建立起一套属于你自己的完整的权限解决方案,作为系统无关的模块去套用到每个你所架构的应用中去”
原理大同小异,我只是将其中的我觉得可以拿出来讲的部分进行抽丝剥茧,起个抛砖引玉的作用,早先我同事设计过一套极其复杂的权限数据库,其中涉及到安全密钥、指纹识别、防火墙设定等等,但无论多复杂,都无法逃离角色-资源的关系,所以我仅仅抽出其中部分来叙述,如若还需扩展,也很方便

# re: web开发中的权限设计拙见一二(2) ----数据库设计  回复  更多评论   

2007-04-20 17:36 by netbrand
疑问:
1.如果再有一个权限,privilege_code CHAR,还能存储吗??
2.如果一个用户有多个角色,那么如何进行这些权限如何合并??

# re: web开发中的权限设计拙见一二(2) ----数据库设计  回复  更多评论   

2008-11-24 11:43 by oven
初学权限设计,受益匪浅。

# JAVA开发中的权限设计  回复  更多评论   

2009-03-26 23:44 by interdrp
疑问:
1.如果再有一个权限,privilege_code CHAR,还能存储吗??
看你字段大小

2.如果一个用户有多个角色,那么如何进行这些权限如何合并??
多个角色我用的是策略组来实现的

权限->策略->用户 实例 www.interdrp.com 下载分销系统客户端,用系统提示的默认的帐套及用户名进入系统即可。
有什么好的想法也可以在 http://www.cnblogs.com/interdrp/ 提出,谢谢

# re: web开发中的权限设计拙见一二(2) ----数据库设计  回复  更多评论   

2009-08-19 15:12 by kystream
很是基础啊。。呵呵

只有注册用户登录后才能发表评论。


网站导航: