मुझे लगता है कि उपयोगकर्ता की अनुमति को लागू करने के लिए बिटवाइज़ ऑपरेटर सबसे अच्छा तरीका है। यहां मैं दिखा रहा हूं कि हम इसे मैसकॉल के साथ कैसे लागू कर सकते हैं।
नीचे कुछ नमूना डेटा के साथ एक नमूना तालिका है:
तालिका 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 : उपयोगकर्ता आईडी को उपयोगकर्ता आईडी, नाम और भूमिका संग्रहीत करने के लिए। भूमिका की गणना अनुमतियों के योग के रूप में की जाएगी।
उदाहरण:
यदि उपयोगकर्ता 'केतन' के पास 'उपयोगकर्ता-ऐड' (बिट = 1) और 'ब्लॉग-डिलीट' (बिट -64) की अनुमति है, तो भूमिका 65 (1 + 64) होगी।
यदि उपयोगकर्ता 'मेहता' को 'ब्लॉग-व्यू' (बिट = 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 एक बिटवाइज़ ऑपरेटर है जो आउटपुट देगा -
User-Add - 1
Blog-Delete - 64
यदि हम मौसम की जांच करना चाहते हैं तो किसी विशेष उपयोगकर्ता के पास उपयोगकर्ता-संपादन अनुमति है या नहीं-
SELECT * FROM `user`
WHERE role & (select bit from permission where name='user-edit')
आउटपुट = कोई पंक्तियाँ नहीं।
आप यह भी देख सकते हैं: http://goo.gl/ATnj6j