2010-02-25 18 views
8

हमारे पास हमारे (एएसपी.नेट वेब) एप्लिकेशन में अनुमति की एक जटिल प्रणाली है। उपयोगकर्ताओं के पास विभिन्न प्रकार की वस्तुओं पर विशिष्ट अनुमतियां हो सकती हैं, कुछ अनुमतियों को समूहों/भूमिकाओं में भी पैक किया जाता है जो उपयोगकर्ताओं को सौंपा जाता है। यह सब एक बहुत ही जटिल गड़बड़ी में समाप्त होता है जहां यह निर्धारित करने के लिए कि कोई उपयोगकर्ता कुछ कर सकता है/देख सकता है, आपको अनुमतियों के कई अलग-अलग स्रोतों का मूल्यांकन करना है और यह किसी भी तरह से मांग पर और विशिष्ट परिस्थितियों के आधार पर किया जाता है।अनुमति हैंडलिंग के लिए पैटर्न/डिज़ाइन सुझाव

मेरा प्रश्न है (उच्च स्तर के दृष्टिकोण से) क्या सामान्य रूप से अनुमति अवधारणा से निपटने के लिए कुछ सुझाव/सामान्य डिजाइन पैटर्न हैं और शायद आपके आर्किटेक्चर में उन्हें संभालने के साथ आपका अनुभव क्या है।

+1

3.5 में "एएसपी.NET सदस्यता" भी है जिसमें इस से निपटने के लिए कुछ सुविधाएं हैं, लेकिन मुझे नहीं पता कि प्रोग्रामर अनुकूल कैसे है। – AaronLS

+0

एक अच्छा सवाल है, जिसे नीचे सूचीबद्ध लोगों की तुलना में बेहतर उत्तर की आवश्यकता है। मैं जावा में कुछ ऐसा देख रहा हूं, लेकिन विरासत अनुमतियों की इजाजत देता हूं। मुझे नेट पर पैटर्न/एल्गोरिदम खोजने में कठिनाई हुई है। – cs94njw

उत्तर

5

उपयोगकर्ता और एक परमाणु एक समूह के साथ जुड़े अनुमति के लिए bool UserHasPermission(SOME_PERMISSION) का परीक्षण करने की क्षमता के साथ समूह, प्राधिकरण के लिए मानक दृष्टिकोण है, लेकिन बातें करने के दावों के आधार पर बदल रहे हैं:

http://msdn.microsoft.com/en-us/magazine/ee335707.aspx

http://msdn.microsoft.com/en-us/magazine/cc163366.aspx

http://www.infoq.com/news/2009/10/Guide-Claim-Based-Identity

हालांकि, यह सभी स्थितियों के लिए आदर्श नहीं है।

पुराने मॉडल के लिए, मुझे लगता है कि प्रदर्शन अनुमतियों के दौरान ज्ञापन का उपयोग करके प्रदर्शन प्राप्त किया जा सकता है। इस तरह मैं अभिगम नियंत्रण की जांच के लिए प्रति सत्र डेटाबेस एन बार नहीं जा रहा हूं। ज्ञापन प्रभावी ढंग से एक ही पैरामीटर के साथ एक कॉल के परिणामस्वरूप कैश में स्टोर करता है, इसलिए XYZ अनुमति की जांच करने के लिए किसी विशेष उपयोगकर्ता द्वारा सभी कॉल एक ही परिणाम लौटाएंगे। बेशक, आप सुनिश्चित करेंगे कि आपने सत्र में उपयोगकर्ता के लिए ज्ञात अनुमतियां संग्रहीत की हैं, इसलिए यह प्रति उपयोगकर्ता है। यदि आप लॉगिन पर अनुमतियां लोड करते हैं तो आपको उन्हें कैश करने की आवश्यकता नहीं है, लेकिन कई प्रणालियों में बड़ी अनुमतियों के साथ कभी-कभी उन्हें आवश्यकता होने पर ही उन्हें प्राप्त करना सबसे अच्छा होता है।

http://www.infoq.com/news/2007/01/CSharp-memory

2

मैं एक अनुप्रयोग विकास के दृष्टिकोण से इस के साथ पेश नहीं किया है, लेकिन अक्सर जब अनुमतियों के साथ काम कर यह नहीं बल्कि वस्तु उपयोगकर्ताओं को सीधे अनुमति देने से, भूमिकाओं का उपयोग करके वस्तुओं के लिए अनुमति सेट करने के लिए एक अच्छी आदत है। यदि किसी उपयोगकर्ता को किसी विशेष वस्तु के उपयोग की आवश्यकता होती है, तो आप उन्हें सीधे पहुंच नहीं देते हैं, इसके बजाय आप उन्हें एक भूमिका देते हैं, जिसके बदले में आवश्यक पहुंच होती है। इस तरह से भूमिका बनाने में लगाए गए काम को "पुन: उपयोग" किया जाता है।

कोड में इसके साथ काम करना जटिल हो सकता है, क्योंकि आपको उपयोगकर्ता की भूमिकाओं में से प्रत्येक के माध्यम से पुनरावृत्ति करने की आवश्यकता है और यह निर्धारित करता है कि भूमिका वस्तु को उपयोगकर्ता को अनुमति देती है या नहीं। मुझे उस तरह के कोड को अपने स्वयं के ढांचे में कारक बनाने की कोशिश करने के स्पष्ट होने के अलावा अन्य किसी भी सौदे से निपटने के बारे में कोई विशिष्ट सुझाव नहीं पता है।

+0

शायद कोई बेहतर तरीका नहीं है, यह मूल रूप से सवाल है;) वास्तव में हमारे पास इन समूहों और भूमिकाओं की अवधारणाएं हैं जो अंतिम उपयोगकर्ता के लिए बहुत सुविधाजनक बनाती हैं जिनके पास अनुमतियों को कॉन्फ़िगर करने के विभिन्न तरीके हैं। समस्या हमारे लिए एक रखरखाव समस्या है जहां इन सभी अलग-अलग स्रोतों का प्रबंधन करना अधिक से अधिक कठिन हो जाता है। –

6

मैंने कई जटिल अनुमति योजना देखी है। इसके लिए हमेशा एक औचित्य था, लेकिन दुर्भाग्यवश, समय पर, वे सभी सौदा करने के लिए बहुत जटिल हो गए और कुछ आसान हो गए।

मेरा निजी निष्कर्ष अब है: पर चिपकने के लिए भूमिका आधार पहुंच नियंत्रण (RBAC) यह एकमात्र उचित है जिसे हर कोई समझता है। यह किसी भी तरह सीमित है, लेकिन ज्यादातर मामलों के लिए पर्याप्त है।

इसके अलावा, डिफ़ॉल्ट नीति से इनकार करते हैं, यानी, आप केवल अधिकार प्रदान करते हैं।दोबारा, मैंने सिस्टम को विपरीत (डिफ़ॉल्ट रूप से अनुमति दें) या यहां तक ​​कि कॉन्फ़िगर करने योग्य डिफ़ॉल्ट नीति (!) भी देखा है और मुझे यह उचित नहीं लगता है।

संबंधित मुद्दे