我正在使用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`)
);
我想沒有必要使用鏈接表「object_method」,因爲您已經在role_object_method中關聯角色了。 –
爲什麼不使用框架?有很多可供選擇的例如RBAC或ABAC(基於屬性的訪問控制) –
將來我可能會使用框架(我一直在關注Zend)。目前,我有興趣瞭解如何自己創建RBAC代碼,以幫助我更好地理解它。 – Benihana