【发布时间】:2018-03-29 00:47:48
【问题描述】:
我正在开发一个 RBAC 用户身份验证系统,这就是我想出的。
这是我的逻辑:
1)通过id(PK)查找$userAccount的角色/组(user_role)
2)检查角色是否对他们所属的 $webModule 有权限(role_object_method)
3)检查网站部分是否允许执行所需的操作(object_method)
4) 如果返回 > 0 行则返回 true,否则返回 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 个查找表:
user:存储用户注册,id 是 PK INT AUTO_INCREMENT
角色:存储角色(用户、管理员、所有者)
对象:网站不同部分的表格(公共区、会员区、管理区)
方法:可以对内容进行的操作表(查看、添加、发布等)
以及由它们组成的 3 个表:
user_role:存储分配给用户的“组”
object_method:存储各个板块的能力(即如果会员区正在维护,可以暂时移除“member”、“publish”行)
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`)
);
用户角色
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`)
);
角色对象方法
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 代码以帮助我更好地理解它。
标签: php mysql inner-join rbac