关于权限设计中角色继承的问题

javacaihai 2010-05-09 08:44:02

/*************************************
* AUser 用户
**************************************/
create table AUser
(
id int not null identity(1,1),
username varchar(20),
password varchar(20)
)
go
/*************************************
* ARole 角色
**************************************/
create table ARole
(
id int not null identity(1,1),
rolename varchar(20),
pid int not null
)
go
/*************************************
* AUserRole 授予用户角色
**************************************/
create table AUserRole
(
id int not null identity(1,1),
userid int not null,
roleid int not null
)
go
/*************************************
* APrivilege 权限
**************************************/
create table APrivilege
(
id int not null identity(1,1),
privilegename varchar(20),
moduleid int not null,
operationid int not null
)
go
/*************************************
* ARolePrivilege 角色授予权限
**************************************/
create table ARolePrivilege
(
id int not null identity(1,1),
roleid int not null,
privilegeid int not null
)
go
/*************************************
* AMoudle 模块
**************************************/

create table AModule
(
id int not null identity(1,1),
modulename varchar(20)
)
go
/*************************************
* AOperation 操作
**************************************/
create table AOperation
(
id int not null identity(1,1),
operationname varchar(20)
)

go
alter table AUser
add constraint PK_AUser_id primary key(id)
go
alter table AOperation
add constraint PK_AOperation_id primary key(id)
go
alter table ARole
add constraint PK_ARole_id primary key(id)
go
alter table AModule
add constraint PK_AModule_id primary key(id)
go
alter table APrivilege
add constraint PK_APrivilege_id primary key(id)
alter table APrivilege
add constraint FK_AMoudle_APrivilege foreign key(moduleid) references AModule(id)
alter table APrivilege
add constraint FK_AOperation_APrivilege foreign key(operationid )references AOperation(id)
go
alter table ARolePrivilege
add constraint PK_ARolePrivilege_id primary key(id)
alter table ARolePrivilege
add constraint FK_ARole_ARolePrivilege foreign key(roleid) references ARole(id)
alter table ARolePrivilege
add constraint FK_APrvilege_ARolePrivilege foreign key(privilegeid) references APrivilege(id)
go
alter table AUserRole
add constraint PK_AUserRole_id primary key(id)
alter table AUserRole
add constraint FK_AUser_AUserRole foreign key(userid) references AUser(id)
alter table AUserRole
add constraint FK_ARole_AUserRole foreign key(roleid) references ARole(id)


表的结构比较简单。
我设计的是一个权限管理模块。(功能可能不健全,慢慢完善)
1)用户<---------->角色<----------->权限(模块,操作)

2) 用户与角色多对多的关系 ,角色与权限多与多的关系

3) 角色可以继承 ,(角色A继承角色B 那么角色A继承角色B的权限)这是rbac模型的原话。

如果按照角色A 继续角色B的权限权限思路
我做了一个类比:
销售经理 与 销售代表 这二种角色
销售经理的权限大于销售代表的权限 那么销售经理继承销售代表这个角色吗?(感觉有点别扭)
不理解。
但是表的设计感觉这样这样吧(如下) 对应ARole 的表内容
id rolename pid
1 销售经理 0
2 销售代表 1
3 。。。。
4 。。。。

问题1):与销售经理继承销售代表矛盾。(希望高手帮忙解答)

根据上表结构,我的思路是这样
假设用户A是销售经理
1)在用户角色表中 得到 用户A对应的角色(销售经理)
2)根据角色 去 获得权限 由于角色可以继承 所以获得权限是销售经理的本身的权限 +销售代表的权限
问题2:这种思路的有没有问题?sql如果去编写。希望高手帮忙解答。
...全文
467 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
javacaihai 2010-05-10
  • 打赏
  • 举报
回复
角色可以继承 ,(角色A继承角色B 那么角色A继承角色B的权限)这是rbac模型的原话。

但是表的设计感觉这样这样吧(如下) 对应ARole 的表内容
id rolename pid
1 销售经理 0
2 销售代表 1
3 。。。。
4 。。。。

销售经理的权限大于销售代表的权限 那么销售经理继承销售代表这个角色吗?(感觉有点别扭)
销售代表的 父id 是 销售经理 与上述有点矛盾。。
这点我感到疑问 希望高手给我指点一下。。
Q315054403 2010-05-10
  • 打赏
  • 举报
回复
典型的BOM应用设计,呵呵
javacaihai 2010-05-09
  • 打赏
  • 举报
回复
对不起大家 可能表达差了点 没让5楼明白。
主要是基于RBAC 的权限控制。
用户 角色 与 权限 三者的关系。
假设用户A是销售经理
1)在用户角色表中 得到 用户A对应的角色(销售经理)
2)根据角色 去 获得权限 由于角色可以继承 所以获得权限是销售经理的本身的权限 +销售代表的权限

select * from AUserRole
left join ARole on ARole.id=AUserRole.roleid
left join ARolePrivilege on ARole.id=ARolePrivilege.roleid
left join APrivilege on ARolePrivilege.privilegeid=APrivilege.id
left join AOperation on AOperation.id=APrivilege.operationid
left join AModule on AModule.id=APrivilege.moduleid
where AUserRole.roleid=XX

这样写 只能得到销售经理的权限。继承的权限未获得。。
喜-喜 2010-05-09
  • 打赏
  • 举报
回复
“SQL操作权限继承”

在授权语句的后面加上 with grant option 就可以啦!

'grant...with grant option'

1. 删除原有帐号s,s1

SQL> conn sys/password as sysdba;
Connected.
SQL> drop user s cascade;

User dropped.

SQL> drop user s1 cascade;

User dropped.

2. 创建帐号s,s1

SQL> create user s identified by password;

User created.

SQL> grant create session,resource to s;

Grant succeeded.

SQL> create user s1 identified by password;

User created.


SQL> grant create session ,resource to s1;

Grant succeeded.

3.给s赋给对象权限,with grant option,表示权限可以传递

SQL> grant select on hr.employees to s with grant option;

Grant succeeded.

SQL> conn s/password
Connected.

4. 传递权限

SQL> grant select on hr.employees to s1;

Grant succeeded.

SQL> conn s1/password
Connected.

SQL> select last_name from hr.employees
2 where employee_id=118;

LAST_NAME
-------------------------
Himuro

SQL> conn hr/hr
Connected.

5. 收回s的对象权限


SQL> revoke select on hr.employees from s;

Revoke succeeded.

6. s1帐号中从s传递的权限也被收回

SQL> conn s1/password;
Connected.
SQL> select last_name from hr.employees
2 where employee_id=118;
select last_name from hr.employees
*
ERROR at line 1:
ORA-00942: table or view does not exist

注意:当收回s的权限时,s1的权限也不能使用
javacaihai 2010-05-09
  • 打赏
  • 举报
回复
高手过来see一下。。。
轻听 2010-05-09
  • 打赏
  • 举报
回复
A可以先继承B的权限:grant B
to A
然后再给A添加权限:grant <权限>[,<权限>].....
on 对象名
to A
(刚学SQL不久,呵呵,只懂皮毛)
--小F-- 2010-05-09
  • 打赏
  • 举报
回复
好长啊
javacaihai 2010-05-09
  • 打赏
  • 举报
回复
大侠们 给点意见。。谢谢。。

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧