我正在使用RBAC用户认证系统,这就是我想出的。带内部连接和查找表的RBAC
这里是我的逻辑:
1)找到$ userAccount的角色/组(USER_ROLE)由id
(在PK的方式)
2)检查角色有权对$ webModule他们是一个(role_object_method)
3)检查网站部分允许需要的动作(object_method)
4)返回true,如果> 0行返回,否则返回false
查询:从函数调用hasPermission称为($ userAccount,$ webModule,$ webOperation)返回一个布尔值
SELECT `user`.`account,
FROM `user`
INNER JOIN `user_role`
ON `user`.`id` = `user_role`.`user_id`
AND `user`.`account` = '$userAccount'
INNER JOIN `role_object_method`
ON `role_object_method`.`role_group` = `user_role`.`role_group`
INNER JOIN `object_method`
ON `role_object_method`.`object_module` = `object_method`.`object_module`
AND `role_object_method`.`method_operation` = `object_method`.`method_operation`
AND `object_method`.`object_module` = '$webModule'
AND `object_method`.`method_operation` = '$webOperation';
我对桌子很有信心,但是对于进行INNER JOIN来说是新的。我写的查询是否执行我期望的4个步骤?
到目前为止,我的测试已经产生了我想要的结果,但是我想通过那些熟悉使用INNER JOIN的人来运行查询。
谢谢。
其他信息
我创建4个查找表:
用户:存储用户注册,id
是PK INT AUTO_INCREMENT
作用:专卖店角色(用户,管理员,所有者)
对象:网站的不同部分(公共区域,会员区,管理区)
方法表:操作表可以做内容(查看,添加,发布等)
和3表从他们包括:
USER_ROLE:分配给用户
object_method存储 “组”:存储每个区段的能力(ⅰ .E。如果会员区正在维护,可以删除行“成员”,“发布”临时)
role_object_method:存储每个组具有权限的网站的每个部分
有3个变量相关:
$ userAccount:由$ _SESSION变量用户登录成功
$ webModule后提供:通过网页提供的的用户访问该网站
$ webOperation:在
用户编码
CREATE TABLE `user` (
`id` INT AUTO_INCREMENT,
`account` CHAR,
PRIMARY KEY (`id`)
);
作用
CREATE TABLE `role` (
`group` CHAR,
PRIMARY KEY (`group`)
);
对象
CREATE TABLE `object` (
`module` CHAR,
PRIMARY KEY (`module`)
);
方法
CREATE TABLE `method` (
`operation` CHAR,
PRIMARY KEY (`operation`)
);
USER_ROLE
CREATE TABLE `user_role` (
`user_id` INT ,
`role_group` CHAR,
PRIMARY KEY (`user_id`, `role_group`),
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
FOREIGN KEY (`role_group`) REFERENCES `role` (`group`)
);
object_method
CREATE TABLE `object_method` (
`object_module` CHAR,
`method_operation` CHAR,
PRIMARY KEY (`object_module`, `method_operation`),
FOREIGN KEY (`object_module`) REFERENCES `object` (`module`),
FOREIGN KEY (`method_operation`) REFERENCES `method` (`operation`)
);
role_object_method
CREATE TABLE `role_object_method` (
`role_group` CHAR,
`object_module` CHAR,
`method_operation` CHAR,
PRIMARY KEY (`role_group`, `object_module`, `method_operation`),
FOREIGN KEY (`role_group`) REFERENCES `role` (`group`),
FOREIGN KEY (`object_module`) REFERENCES `object` (`module`),
FOREIGN KEY (`method_operation`) REFERENCES `method` (`operation`)
);
我想没有必要使用链接表“object_method”,因为您已经在role_object_method中关联角色了。 –
为什么不使用框架?有很多可供选择的例如RBAC或ABAC(基于属性的访问控制) –
将来我可能会使用框架(我一直在关注Zend)。目前,我有兴趣了解如何自己创建RBAC代码,以帮助我更好地理解它。 – Benihana