2017-10-17 22 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