1、RBAC 概述
RBAC(Role-Based Access Control)即基于角色的访问控制,是一种权限设计思想。在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员来获得这些角色的权限。相较传统的访问控制(自主访问、强制访问)来说,RBAC 能更好的支持最小权限、责任分离和数据抽象等原则,极大地简化了权限的管理。
在一个组织中,角色是为了完成各种工作而创造,而用户则根据他的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。每个角色都拥有与之相匹配的权限,角色可依据新的需求而赋予新的权限,而权限也可根据需要而从某角色中回收。这样的权限设计,结构清晰、管理方便,也能囊括更广泛的客观情况。
RBAC 的优点主要在于易用和高效。给用户授权时只需要对角色授权,然后将相应的角色分配给用户即可;从技术角度讲,思路清晰且易于实现,且后期维护时只需要维护关系模型,显得简单而高效。
RBAC 的缺点主要有两个:一个是在进行较为复杂的权限校验时需要不断地遍历和递归,会造成一定的性能影响。另一个是缺少数据权限模型,基于 RBAC 来实现数据权限校验比较复杂和低效。
经过 20 多年的发展,RBAC 已被广泛应用到很多领域的系统或软件,同时也产生了许多应用模型。本文的理论部分到此结束,有兴趣了解更多的朋友可参考:
- Role-Based Access Controls
- AN INTRODUCTION TO ROLE-BASED ACCESS CONTROL
- ROLE BASED ACCESS CONTROL (RBAC) AND ROLE BASED SECURITY
- 了解基于角色的访问控制
2、表结构设计
2.1、用户表
CREATE TABLE t_user(
user_id NUMBER(10) PRIMARY KEY,
user_name VARCHAR2(30),
gender NUMBER(1),
birthday DATE,
create_time DATE DEFAULT SYSDATE
);
COMMENT ON TABLE t_user IS '用户表';
COMMENT ON COLUMN t_user.user_id IS '用户ID';
COMMENT ON COLUMN t_user.user_name IS '用户姓名';
COMMENT ON COLUMN t_user.gender IS '性别{1男/0女}';
COMMENT ON COLUMN t_user.birthday IS '出生日期';
COMMENT ON COLUMN t_user.create_time '创建时间';
2.2、角色表
CREATE TABLE t_role(
role_id NUMBER(10) PRIMARY KEY,
role_name VARCHAR2(30),
create_time DATE DEFAULT SYSDATE
);
COMMENT ON TABLE t_role IS '角色表';
COMMENT ON COLUMN t_role.role_id IS '角色ID';
COMMENT ON COLUMN t_role.role_name IS '角色名称';
COMMENT ON COLUMN t_role.create_time '创建时间';
2.3、权限表
CREATE TABLE t_power(
power_id NUMBER(10) PRIMARY KEY,
power_name VARCHAR2(30),
create_time DATE DEFAULT SYSDATE
);
COMMENT ON TABLE t_power IS '权限表';
COMMENT ON COLUMN t_power.power_id IS '权限ID';
COMMENT ON COLUMN t_power.power_name IS '权限名称';
COMMENT ON COLUMN t_power.create_time '创建时间';
2.4、用户角色(关系)表
CREATE TABLE t_user_role(
user_id NUMBER(10) NOT NULL,
role_id NUMBER(10) NOT NULL ,
create_time DATE DEFAULT SYSDATE
);
COMMENT ON TABLE t_user_role IS '用户角色(关系)表';
COMMENT ON COLUMN t_user_role.user_id IS '用户ID';
COMMENT ON COLUMN t_user_role.role_id IS '角色ID';
COMMENT ON COLUMN t_user_role.create_time '创建时间';
2.5、角色权限(关系)表
CREATE TABLE t_role_power(
role_id NUMBER(10) NOT NULL,
power_id NUMBER(10) NOT NULL
);
COMMENT ON TABLE t_role_power IS '角色权限(关系)表';
COMMENT ON COLUMN t_role_power.role_id IS '角色ID';
COMMENT ON COLUMN t_role_power.power_id IS '权限ID';
COMMENT ON COLUMN t_role_power.create_time '创建时间';
3、总结
与我而言,本篇小文也就相当于是一个功能模块表设计 SQL 语句的备份。以前做项目也经常按类似的思路来设计系统权限模块的表,但一直不知道 RBAC 的存在,本篇是结合 RBAC 思想把项目中的表设计抽取出来,将建表的 SQL 语句贴在这儿,省的每次都要重新来过。
本文链接:http://www.cnblogs.com/hanzongze/p/oracle-sql-rbac.html
版权声明:本文为博客园博主 韩宗泽 原创,作者保留署名权!欢迎通过转载、演绎或其它传播方式来使用本文,但必须在明显位置给出作者署名和本文链接!个人博客,能力有限,若有不当之处,敬请批评指正,谢谢!