ฉันคิดว่าตัวดำเนินการระดับบิตเป็นวิธีที่ดีที่สุดในการใช้สิทธิ์ผู้ใช้ ที่นี่ฉันจะแสดงวิธีที่เราสามารถใช้กับ Mysql
ด้านล่างเป็นตารางตัวอย่างที่มีข้อมูลตัวอย่าง:
ตารางที่ 1 : ตารางสิทธิ์ในการจัดเก็บชื่อการอนุญาตพร้อมกับบิตเช่น 1,2,4,8..etc (หลายจาก 2)
CREATE TABLE IF NOT EXISTS `permission` (
`bit` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
แทรกข้อมูลตัวอย่างลงในตาราง
INSERT INTO `permission` (`bit`, `name`) VALUES
(1, 'User-Add'),
(2, 'User-Edit'),
(4, 'User-Delete'),
(8, 'User-View'),
(16, 'Blog-Add'),
(32, 'Blog-Edit'),
(64, 'Blog-Delete'),
(128, 'Blog-View');
ตารางที่ 2 : ตารางผู้ใช้เพื่อเก็บ ID ผู้ใช้ชื่อและบทบาท บทบาทจะถูกคำนวณเป็นผลรวมของสิทธิ์
ตัวอย่าง:
หากผู้ใช้ 'Ketan' ได้รับอนุญาตจาก 'ผู้ใช้เพิ่ม' (บิต = 1) และ 'บล็อกลบ' (บิต -64) ดังนั้นบทบาทจะเป็น 65 (1 + 64)
หากผู้ใช้ 'Mehata' ได้รับอนุญาตจาก 'มุมมองบล็อก' (บิต = 128) และ 'ผู้ใช้ลบ' (บิต -4) ดังนั้นบทบาทจะเป็น 132 (128 + 4)
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`role` int(11) NOT NULL,
`created_date` datetime NOT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ตัวอย่างข้อมูล -
INSERT INTO `user` (`id`, `name`, `role`, `created_date`)
VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'),
(NULL, 'Mehata', '132', '2013-01-09 00:00:00');
การอนุญาตให้ใช้รหัสของผู้ใช้หลังจากเข้าสู่ระบบหากเราต้องการโหลดสิทธิ์ผู้ใช้มากกว่าที่เราสามารถสอบถามด้านล่างเพื่อรับสิทธิ์:
SELECT permission.bit,permission.name
FROM user LEFT JOIN permission ON user.role & permission.bit
WHERE user.id = 1
ที่นี่ user.role "&" permission.bit เป็นตัวดำเนินการ Bitwise ซึ่งจะให้ผลลัพธ์เป็น -
User-Add - 1
Blog-Delete - 64
หากเราต้องการตรวจสอบสภาพอากาศผู้ใช้คนใดคนหนึ่งได้รับอนุญาตให้แก้ไขโดยผู้ใช้หรือไม่ -
SELECT * FROM `user`
WHERE role & (select bit from permission where name='user-edit')
เอาท์พุท = ไม่มีแถว
คุณสามารถดูได้ที่: http://goo.gl/ATnj6j