Saya pikir operator bitwise adalah cara terbaik untuk menerapkan izin pengguna. Di sini saya menunjukkan bagaimana kita dapat mengimplementasikannya dengan Mysql.
Di bawah ini adalah tabel sampel dengan beberapa data sampel:
Tabel 1 : Tabel izin untuk menyimpan nama izin bersamaan dengan itu seperti 1,2,4,8..etc (kelipatan 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;
Masukkan beberapa data sampel ke dalam tabel.
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');
Tabel 2 : Tabel pengguna untuk menyimpan id, nama, dan peran pengguna. Peran akan dihitung sebagai jumlah izin.
Contoh:
Jika pengguna 'Ketan' memiliki izin 'Tambah Pengguna' (bit = 1) dan 'Hapus Blog' (bit-64) maka perannya adalah 65 (1 + 64).
Jika pengguna 'Mehata' memiliki izin 'Tampilan Blog' (bit = 128) dan 'Hapus Pengguna' (bit-4) maka perannya adalah 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;
Contoh data-
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');
Memberi izin pengguna Setelah masuk jika kami ingin memuat izin pengguna daripada yang dapat kami tanyakan di bawah ini untuk mendapatkan izin:
SELECT permission.bit,permission.name
FROM user LEFT JOIN permission ON user.role & permission.bit
WHERE user.id = 1
Di sini user.role "&" permit.bit adalah operator Bitwise yang akan memberikan output sebagai -
User-Add - 1
Blog-Delete - 64
Jika kami ingin memeriksa cuaca, pengguna tertentu memiliki izin edit pengguna atau tidak-
SELECT * FROM `user`
WHERE role & (select bit from permission where name='user-edit')
Output = Tidak ada baris.
Anda dapat melihat juga: http://goo.gl/ATnj6j