PowerDesigner_数据库设计_通用的RBAC权限系统

通用的RBAC权限系统

  本文只介绍权限系统的设计,暂不涉及PowerDesigner工具的使用,网上有很多这里不再多做介绍.
1. 简单的介绍下RBAC

    基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。

  a. 最简单的RBAC五张表
表名建表名称描述
人员表s_user_t存储系统人员信息
角色表s_role_t存储系统角色信息
资源表s_resource_t存储系统资源信息
人员角色关系表s_userrole_t存储系统人员和角色之间的关系
角色资源关系表s_roleresource_t存储系统角色和系统资源的关系

RBAC五张表

  b. 如果你还想要更多

    仔细观察一下上面的图片也许你就明白为什么叫基于角色的权限访问控制了,因为把用户权限关联起来的唯一基础表就是角色表,角色表通过关系表分别与人员表资源表进行了关联.如果你有了这5张表基本可以满足一个不太复杂的权限系统了,可以用一句话表示:麻雀虽小五脏俱全.
    当然如果你有更复杂的需求,也可以以此为基础继续扩展,如:
     1, 需要组织机构,系统需要展现出用户的组织关系,可以在人员表旁边新建一个组织结构表和组织结构人员关系维护表.如果你要做的权限系统非常庞大.
     2,市下有多个区县,总公司下有多个分公司,分公司下还有多个群组,可以在角色上面继续加建:用户组,区县组,分公司组等,总之万变不离之宗,有这五张表为基础就可包罗万象满足一般系统的绝大部分需求.

2. 建表语句(本例使用数据库为oracle)
s_user_t
/*==============================================================*/
/* Table: s_user_t                                              */
/*==============================================================*/
create table s_user_t 
(
   id                   INTEGER              not null,
   code                 VARCHAR2(50)         not null,
   name                 VARCHAR2(50)         not null,
   loginname            VARCHAR2(50)         not null,
   password             VARCHAR2(200)        not null,
   phonenumber          INTEGER,
   phone                VARCHAR2(20),
   email                VARCHAR2(50),
   headimage            VARCHAR2(200),
   idcard               VARCHAR2(30),
   sex                  INTEGER,
   address              VARCHAR2(100),
   weixinid             VARCHAR2(100),
   validflag            INTEGER              not null,
   usermemo             VARCHAR2(100),
   sysmemo              VARCHAR2(100),
   sn                   INTEGER,
   createname           VARCHAR2(50),
   createtime           DATE,
   updatename           VARCHAR2(50),
   updatetime           TIMESTAMP,
   validname            VARCHAR2(50),
   validtime            DATE,
   memo1                VARCHAR2(200),
   memo2                VARCHAR2(200),
   memo3                VARCHAR2(200),
   memo4                VARCHAR2(200),
   memo5                VARCHAR2(200),
   constraint PK_S_USER_T primary key (id)
)

comment on table s_user_t is
'人员表'
/

comment on column s_user_t.id is
'id'
/

comment on column s_user_t.code is
'编码name'
/

comment on column s_user_t.name is
'姓名'
/

comment on column s_user_t.loginname is
'登陆名'
/

comment on column s_user_t.password is
'密码'
/

comment on column s_user_t.phonenumber is
'手机号(数字)'
/

comment on column s_user_t.phone is
'固定电话'
/

comment on column s_user_t.email is
'邮箱'
/

comment on column s_user_t.headimage is
'头像'
/

comment on column s_user_t.idcard is
'身份证号'
/

comment on column s_user_t.sex is
'性别'
/

comment on column s_user_t.address is
'家庭住址'
/

comment on column s_user_t.weixinid is
'微信id'
/

comment on column s_user_t.validflag is
'有效标记'
/

comment on column s_user_t.usermemo is
'用户备注'
/

comment on column s_user_t.sysmemo is
'系统备注'
/

comment on column s_user_t.sn is
'排序号'
/

comment on column s_user_t.createname is
'创建人'
/

comment on column s_user_t.createtime is
'创建时间'
/

comment on column s_user_t.updatename is
'更新人'
/

comment on column s_user_t.updatetime is
'更新时间'
/

comment on column s_user_t.validname is
'作废人'
/

comment on column s_user_t.validtime is
'作废时间'
/

comment on column s_user_t.memo1 is
'memo1'
/

comment on column s_user_t.memo2 is
'memo2'
/

comment on column s_user_t.memo3 is
'memo3'
/

comment on column s_user_t.memo4 is
'memo4'
/

comment on column s_user_t.memo5 is
'memo5'
/

s_role_t
/*==============================================================*/
/* Table: s_role_t                                              */
/*==============================================================*/
create table s_role_t 
(
   id                   INTEGER              not null,
   code                 VARCHAR2(50),
   name                 VARCHAR2(50),
   describe             VARCHAR2(200),
   validflag            INTEGER,
   usermemo             VARCHAR2(100),
   sysmemo              VARCHAR2(100),
   sn                   INTEGER,
   createname           VARCHAR2(100),
   createtime           DATE,
   updatename           VARCHAR2(100),
   updatetime           DATE,
   validname            VARCHAR2(100),
   validtime            DATE,
   memo1                VARCHAR2(200),
   memo2                VARCHAR2(200),
   memo3                VARCHAR2(200),
   memo4                VARCHAR2(200),
   memo5                VARCHAR2(200),
   constraint PK_S_ROLE_T primary key (id)
);

comment on table s_role_t is
'角色表';

comment on column s_role_t.id is
'id';

comment on column s_role_t.code is
'角色编码';

comment on column s_role_t.name is
'角色名称';

comment on column s_role_t.describe is
'角色描述';

comment on column s_role_t.validflag is
'有效标记';

comment on column s_role_t.usermemo is
'用户备注';

comment on column s_role_t.sysmemo is
'系统备注';

comment on column s_role_t.sn is
'排序号';

comment on column s_role_t.createname is
'创建人';

comment on column s_role_t.createtime is
'创建时间';

comment on column s_role_t.updatename is
'更新人';

comment on column s_role_t.updatetime is
'更新时间';

comment on column s_role_t.validname is
'作废人';

comment on column s_role_t.validtime is
'作废时间';

comment on column s_role_t.memo1 is
'memo1';

comment on column s_role_t.memo2 is
'memo2';

comment on column s_role_t.memo3 is
'memo3';

comment on column s_role_t.memo4 is
'memo4';

comment on column s_role_t.memo5 is
'memo5';

s_resource_t
/*==============================================================*/
/* Table: s_resource_t                                          */
/*==============================================================*/
create table s_resource_t 
(
   id                   INTEGER              not null,
   resourcecode         VARCHAR2(50),
   resourcename         VARCHAR2(50),
   resourceurl          VARCHAR2(200),
   resourcetype         INTEGER,
   fid                  INTEGER,
   display              INTEGER,
   resourceicon         VARCHAR2(100),
   validflag            INTEGER,
   usermemo             VARCHAR2(100),
   sysmemo              VARCHAR2(100),
   sn                   INTEGER,
   createname           VARCHAR2(100),
   createtime           DATE,
   updatename           VARCHAR2(100),
   updatetime           DATE,
   validname            VARCHAR2(100),
   validtime            DATE,
   memo1                VARCHAR2(200),
   memo2                VARCHAR2(200),
   memo3                VARCHAR2(200),
   memo4                VARCHAR2(200),
   memo5                VARCHAR2(200),
   constraint PK_S_RESOURCE_T primary key (id)
);

comment on table s_resource_t is
'资源表';

comment on column s_resource_t.id is
'id';

comment on column s_resource_t.resourcecode is
'资源编码';

comment on column s_resource_t.resourcename is
'资源名称';

comment on column s_resource_t.resourceurl is
'资源路径';

comment on column s_resource_t.resourcetype is
'资源类型(模块,子菜单)';

comment on column s_resource_t.fid is
'父id';

comment on column s_resource_t.display is
'是否显示';

comment on column s_resource_t.resourceicon is
'资源图标';

comment on column s_resource_t.validflag is
'作废标记';

comment on column s_resource_t.usermemo is
'用户备注';

comment on column s_resource_t.sysmemo is
'系统备注';

comment on column s_resource_t.sn is
'排序号';

comment on column s_resource_t.createname is
'创建人';

comment on column s_resource_t.createtime is
'创建时间';

comment on column s_resource_t.updatename is
'更新人';

comment on column s_resource_t.updatetime is
'更新时间';

comment on column s_resource_t.validname is
'作废人';

comment on column s_resource_t.validtime is
'作废时间';

comment on column s_resource_t.memo1 is
'memo1';

comment on column s_resource_t.memo2 is
'memo2';

comment on column s_resource_t.memo3 is
'memo3';

comment on column s_resource_t.memo4 is
'memo4';

comment on column s_resource_t.memo5 is
'memo5';

s_userrole_t
/*==============================================================*/
/* Table: s_userrole_t                                          */
/*==============================================================*/
create table s_userrole_t 
(
   id                   INTEGER              not null,
   userid               INTEGER,
   roleid               INTEGER,
   createname           VARCHAR2(50)         default '1',
   createtime           DATE                 default '1',
   constraint PK_S_USERROLE_T primary key (id)
);

comment on table s_userrole_t is
'人员和角色关系表';

comment on column s_userrole_t.id is
'id';

comment on column s_userrole_t.userid is
'用户id';

comment on column s_userrole_t.roleid is
'角色id';

comment on column s_userrole_t.createname is
'创建人';

comment on column s_userrole_t.createtime is
'创建时间';
s_roleresource_t
/*==============================================================*/
/* Table: s_roleresource_t                                      */
/*==============================================================*/
create table s_roleresource_t 
(
   id                   INTEGER              not null,
   roleid               INTEGER,
   resourceid           INTEGER,
   createname           VARCHAR2(50),
   createtime           DATE,
   constraint PK_S_ROLERESOURCE_T primary key (id)
);

comment on table s_roleresource_t is
'角色和资源关系表';

comment on column s_roleresource_t.id is
'id';

comment on column s_roleresource_t.roleid is
'角色id';

comment on column s_roleresource_t.resourceid is
'资源id';

comment on column s_roleresource_t.createname is
'创建人';

comment on column s_roleresource_t.createtime is
'创建时间';

你也可以上码云直接下载PowerDesigner源文件: https://gitee.com/gaoshaomin/opensystem.git

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、 抽象——总体思路。 先看这个ER图。 很简单,就是说明一下人员和资源的关系,一个人可以使用多个资源,一个资源可以被多个人使用,就是多对多的关系了。 不知道这个是不是可以叫做“抽象”。这个就是在金字塔的顶端来看权限了,站在顶端来看,就这么一点,估计没有那种情况可以逃出这个描述吧。 资源:这里指的资源是广义上的资源,包括很多的东东,模块、数据,菜单、节点、按钮、控件,表、字段、存储过程,页面、窗口、表单、图表、报表,什么都可以算作是一种资源。您也可以把您遇到的一些情况都来算作是一种资源。关于资源先说这些,下面还有详细的说明。 2、 加入权限 第一个图也太简单了,我们把他详细一下,把人员分成两个表——人员基本信息和登录信息,在加入“权限”。就是下面这个表了。 人员分成两个表可以应对很多的情况,比如一个人可以有多个登录帐号,人员基本信息还可以和其他的表相关联,登录方面的需求有什么变化的话,只需要修改登录信息表就可以了,不会影响人员基本信息表,不会让其越来越臃肿。 以前对于“权限”是很模糊的,似有似无的感觉,现在看来他其实就是一个多对多的关联表,呵呵。当然您可以说我的这个看法不对,呵呵,我只是说一下我的感觉。 3、 加入角色 第二个图,是把帐号的资源直接联系起来,这个有一个不方便的地方,比如有五个业务员他们的功能都是一样的,但是我们却需要做五遍一样的操作才能给这五个业务员设置好权限,而当业务员可以做的事情有变化的时候,我就又需要做五次相同的操作,这个就很麻烦了,所以引用了“角色”。 我们可以建立一个业务员角色,设置业务员角色可以做的事情,然后把五个业务员和业务员角色关联起来。这样就方便了,业务员可以做得事情有变化的时候,我只需要修改业务员角色可以做得事情就可以了。 您可能会问,客户的人少,每个人做得事情都不一样,这个怎么办呀? 这也好办呀,一个人一个角色就可以了。虽然对于这种情况多用了一个角色,有点绕远的感觉,但是总体来说是可以接受的。角色初期设置一下就可以了,角色和人员“绑定”之后,修改角色可以做什么事情,和修改人员可以做什么事情,操作步骤都是一样的。 您可能又问了,客户是一个很大的公司,设置了n个角色之后,客户提出了一个需求:张三这个人比较特殊,他可以做XX事情,但是有没有对应的角色,也不想再多设置一个角色了,需要直接给张三设置可以做这件事情就可以了。 这个又要怎么处理呢?是不是要修改表结构了呢?我是不想改的,还是用角色绑定的方法来处理,增加一个“张三专用角色”,这个角色是“隐藏”的,不和其他的角色一样的管理,需要通过对“张三”来管理。这个好像说不太清楚,先这样吧,呵呵。 4、 表关联图 我觉得ER图就是ER图,不能代替表关系图,所以我就又做了一个表关系图。 【图四】 左面从上往下看,人员、登录帐号、角色、资源,右面是两个多对多的关联表。这个看起来就比较清晰了吧。 这个设计还可以吧,资源保罗万象什么都可以往里放,您可以展开您的联想,帮想到的东东都放进去就可以了。 这个图从设计的角度来说应该是挺简洁的,五六个表就搞定了。而且也可以适合很大的范围,因为那个资源的定义实在是太广泛了,到了无所不包的程度了。但是这个设计真的好吗?或者是实用吗? .......

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值