Tôi nghĩ toán tử bitwise là cách tốt nhất để thực hiện sự cho phép của người dùng. Ở đây tôi chỉ ra cách chúng ta có thể thực hiện nó với Mysql.
Dưới đây là bảng mẫu với một số dữ liệu mẫu:
Bảng 1 : Bảng quyền để lưu trữ tên cho phép cùng với nó giống như 1,2,4,8..vv (bội số của 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;
Chèn một số dữ liệu mẫu vào bảng.
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');
Bảng 2 : Bảng người dùng để lưu trữ id người dùng, tên và vai trò. Vai trò sẽ được tính là tổng số quyền.
Ví dụ:
Nếu người dùng 'Ketan' có quyền 'Thêm người dùng' (bit = 1) và 'Blog-Xóa' (bit-64) thì vai trò sẽ là 65 (1 + 64).
Nếu người dùng 'Mehata' có sự cho phép của 'Blog-View' (bit = 128) và 'Xóa người dùng' (bit-4) thì vai trò sẽ là 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;
Dữ liệu mẫu-
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');
Quyền mã hóa của người dùng Sau khi đăng nhập nếu chúng tôi muốn tải quyền của người dùng hơn chúng tôi có thể truy vấn bên dưới để có được quyền:
SELECT permission.bit,permission.name
FROM user LEFT JOIN permission ON user.role & permission.bit
WHERE user.id = 1
Ở đây user.role "&" allow.bit là toán tử Bitwise sẽ cho đầu ra là -
User-Add - 1
Blog-Delete - 64
Nếu chúng tôi muốn kiểm tra thời tiết, một người dùng cụ thể có cho phép người dùng chỉnh sửa hay không-
SELECT * FROM `user`
WHERE role & (select bit from permission where name='user-edit')
Đầu ra = Không có hàng.
Bạn cũng có thể xem: http://goo.gl/ATnj6j