我正在研究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`)
);
答案 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';