RBAC with INNER JOIN和查找表

时间:2017-10-17 10:44:09

标签: php mysql inner-join rbac

我正在研究RBAC用户身份验证系统,这就是我的想法。

这是我的逻辑:

1)通过id(PK)找到$ userAccount的角色/组(user_role)

2)检查角色是否拥有$ webModule的权限(role_object_method)

3)检查网站部分是否允许所需的操作(object_method)

4)如果>则返回true返回0行,否则返回false

查询:从函数hasPermission($ userAccount,$ webModule,$ webOperation)调用,返回bool

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 :存储每个部分的能力(即如果成员区域正在维护,可以删除行“成员”,“临时发布”)

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`)
);

1 个答案:

答案 0 :(得分: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';