【问题标题】:RBAC with INNER JOIN and lookup tables带有 INNER JOIN 和查找表的 RBAC
【发布时间】: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


【解决方案1】:

根据我的建议,如果您删除额外的链接表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';

【讨论】:

  • 谢谢哈蒂姆,感谢您查看我的代码并给我您的代码建议。我用您的代码进行了一些测试,发现它运行良好,但它不允许“3)检查网站部分是否允许所需的操作(object_method)”。这是有道理的,因为该部分已被删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2012-01-25
  • 2011-10-25
相关资源
最近更新 更多