2017-10-17 102 views
0

我正在使用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`) 
); 
+0

我想没有必要使用链接表“object_method”,因为您已经在role_object_method中关联角色了。 –

+0

为什么不使用框架?有很多可供选择的例如RBAC或ABAC(基于属性的访问控制) –

+0

将来我可能会使用框架(我一直在关注Zend)。目前,我有兴趣了解如何自己创建RBAC代码,以帮助我更好地理解它。 – Benihana

回答

0

按我的建议,如果你删除多余的链接表object_method你的查询将改变为此。

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` 
AND `role_object_method`.`object_module` = '$webModule' 
AND `role_object_method`.`method_operation` = '$webOperation'; 
+0

谢谢Hatim,我感谢您查看我的代码并向我提供代码建议。我用你的代码运行了一些测试,发现它运行的很好,但它不允许“3)检查网站部分允许所需的操作(object_method)”。这部分被删除后,这是有道理的。 – Benihana