इस समस्या के दो आम दृष्टिकोण हैं, दोनों में स्वीकार्य संचालन को अलग-अलग कुछ अलग करने में शामिल करना शामिल है जिसे आप नाम दे सकते हैं। (पोस्ट हटाएं, गैलरी बनाएं, कोड को अपग्रेड करें, डेटाबेस को डंप करें, मिसाइल लॉन्च करें, गेराज दरवाजा खोलें।) इनमें से प्रत्येक को बिटवेक्टर में बिटमैप दें (यदि आप 32 से कम अनुमतियों का इरादा रखते हैं, तो यह अच्छा है और कॉम्पैक्ट स्टोरेज तंत्र; यदि आपको लगता है कि यह 32 अनुमतियों से अधिक हो जाएगा, एक सामान्य पूर्णांक का आकार, तो शायद आपके डेटाबेस में एक तालिका ..)
तो, आप या तो उपयोगकर्ताओं को सीधे अनुमतियों के लिए मानचित्र कर सकते हैं ("I gallery_create
sarnold
को देना चाहते हैं ") या आप उन की कक्षाओं के माध्यम से उपयोगकर्ता और अनुमतियां मैप कर सकते हैं (" मैं art_curator
वर्ग के सभी सदस्यों को gallery_create
देना चाहते हैं, तो मैं "art_curator
को docent
से उपयोगकर्ता sarnold
बढ़ावा देने के लिए) चाहते हैं।
यदि आप उपयोगकर्ताओं को सीधे अनुमतियों के लिए मानचित्र बनाते हैं, तो आपको बाद में तैनाती में अजीब अनुमतियों का एक हॉज-पॉज मिल सकता है। यदि आप कक्षाओं में उपयोगकर्ताओं को मैप करते हैं, तो आप स्वयं को उपयोगकर्ताओं के कृत्रिम वर्गों के साथ पा सकते हैं क्योंकि आपने विशेषाधिकार वाले एक विशिष्ट व्यक्ति पर भरोसा किया है, लेकिन अन्य विशेषाधिकार नहीं हैं।
इस मैपिंग को संबोधित करने का सबसे अच्छा तरीका अभी भी एक खुली समस्या है; मैंने विभिन्न प्रकार के अनुमति मॉडल Modelling a permissions system के बारे में लिखा है जो कि आपके सिस्टम को कितना जटिल बनाना चाहते हैं, इस पर निर्भर करता है कि बहुत अधिक जानकारी हो सकती है या बहुत कम हो सकती है।
आप बिटमैप्स में सिर्फ दुकान अनुमतियाँ (जैसे, CAP_SYS_ADMIN
के लिए CAPABLE()
के लिनक्स कर्नेल के कार्यान्वयन, CAP_DAC_OVERRIDE
, और आगे) तो आप नए विशेषाधिकारों के साथ जोड़ सकते हैं करना चाहते हैं तो बहुत ही सरल कुछ:
if (requested_new_permission == "CAP_SYS_ADMIN")
user->permissions |= CAP_SYS_ADMIN;
else if (requested_new_permissions == "CAP_DAC_OVERRIDE")
user->permissions |= CAP_DAC_OVERRIDE;
...
फिर जब आप क्षमताओं का परीक्षण करने की जरूरत है:
if (CAPABLE(user, CAP_SYS_ADMIN))
reboot_server();
और मैक्रो CAPABLE()
देख सकते हैं जैसे:
#define सक्षम (उपयोगकर्ता, टोपी) ((उपयोगकर्ता) -> अनुमतियाँ & (टोपी))
(php सी माफ कर दो, मैं सिर्फ पता नहीं है बहुत अच्छी तरह से; मुझे खुद को सीखना चाहते हैं कि बहुत से php कीड़े को ठीक करने के लिए मजबूर किया गया है।एक users
मेज, एक groups
या classes
मेज, और एक permissions
तालिका:)
आप उपयोगकर्ता कक्षाओं के माध्यम से अनुमति के उपयोगकर्ताओं मैप करना चाहते हैं, तो यह तीन टेबल हो सकता है। classes
में user_id
और permission_id
के लिए कॉलम हैं। जब आपको यह जांचने की आवश्यकता होती है कि अनुमति दी जा सकती है, तो उपयोगकर्ता की कक्षा का चयन करें, फिर कक्षा में अनुमति का चयन करें। (यह भी वर्षों से है जब मैंने एसक्यूएल लिखा है; मुझे यकीन है कि एक प्रश्न आपको हाँ या कोई जवाब नहीं दे सकता है, लेकिन मुझे यकीन नहीं है कि यह एक से अधिक टेबल में शामिल होगा या उपक्विरी का उपयोग करेगा या यदि यह डेटाबेस में दो प्रश्न बनाना आसान होगा। :)
उम्मीद है कि इससे मदद मिलती है।
पीयर लाइव_उसर में देखें। यह पुराना है और कभी मानक नहीं बनता है, लेकिन यह अधिकांश अनुमतियों को माइक्रोमैनेजमेंट को संभालता है। – mario