भूमिका बनाम अनुमति आधारित अभिगम नियंत्रण


44

जब मैं अभिगम नियंत्रण (प्राधिकरण) की बात आती है तो मैं भूमिकाओं और अनुमतियों के बीच निहित व्यापार को समझने की कोशिश कर रहा हूं।

के साथ शुरू करते हैं एक दिया: हमारी प्रणाली में, एक की अनुमति एक्सेस ( "का जुर्माना-कणों का इकाई हो जाएगा संपादित संसाधन एक्स ", " पहुँच डैशबोर्ड पृष्ठ ", आदि)। एक भूमिका 1+ अनुमतियों का एक संग्रह होगी। एक उपयोगकर्ता में 1+ भूमिकाएं हो सकती हैं। ये सभी रिश्ते (उपयोगकर्ता, भूमिकाएं, अनुमतियां) सभी एक डेटाबेस में संग्रहीत किए जाते हैं और इसे मक्खी पर और आवश्यकतानुसार बदला जा सकता है।

मेरी चिंताएँ:

(1) अभिगम नियंत्रण के लिए रोल्स की जाँच करने के बारे में "बुरा" क्या है? इसके बजाय अनुमतियों की जाँच करके क्या लाभ प्राप्त होते हैं? दूसरे शब्दों में, इन दो स्निपेट के बीच क्या अंतर है:

if(SecurityUtils.hasRole(user)) {
    // Grant them access to a feature
}

// vs.
if(SecurityUtils.hasPermission(user)) {
    // Grant them access to a feature
}

तथा:

(२) इस परिदृश्य में रोल्स क्या उपयोगी मूल्य प्रदान करते हैं? क्या हम उपयोगकर्ताओं को सीधे 1+ अनुमतियाँ नहीं दे सकते हैं? क्या ठोस भूमिकाओं (कर सकते हैं किसी को दे विशिष्ट उदाहरण) अमूर्त मूल्य प्रदान करते हैं?


2
कुछ बिंदु: (1) एक एकल उपयोगकर्ता की कई भूमिकाएँ हो सकती हैं, (2) आप एसीएल (एक्सेस कंट्रोल लिस्ट) में देखना चाहते हैं, उदाहरण के लिए। आप डैशबोर्ड पृष्ठों के एक सबसेट (यदि वहाँ कई हैं) के लिए "डैशबोर्ड पृष्ठ पर पहुँचें" देने में सक्षम होना चाहते हैं।
मैथ्यू एम।

जवाबों:


62

(1) अभिगम नियंत्रण के लिए रोल्स की जाँच करने के बारे में "बुरा" क्या है? इसके बजाय अनुमतियों की जाँच करके क्या लाभ प्राप्त होते हैं?

जाँच के समय, कॉलिंग कोड को केवल यह जानना होगा कि "क्या उपयोगकर्ता X को कार्रवाई Y करने की अनुमति है?"
कॉलिंग कोड के बारे में परवाह नहीं है और भूमिकाओं और अनुमतियों के बीच संबंधों के बारे में पता नहीं होना चाहिए।

प्राधिकरण की परत तब जांच करेगी कि उपयोगकर्ता के पास यह अनुमति है या नहीं, आमतौर पर यह जांचने से कि उपयोगकर्ता की भूमिका में यह अनुमति है या नहीं। यह आपको कॉलिंग कोड को अपडेट किए बिना प्राधिकरण तर्क को बदलने की अनुमति देता है।

यदि आप सीधे कॉल साइट पर भूमिका की जांच करते हैं, तो आप स्पष्ट रूप से भूमिका and अनुमति संबंध बनाने और कॉलिंग कोड में प्राधिकरण तर्क को इंजेक्ट करने, चिंताओं को अलग करने का उल्लंघन करते हैं।

क्या आपको बाद में यह तय fooकरना चाहिए कि भूमिका की अनुमति नहीं होनी चाहिए baz, आपको प्रत्येक कोड को बदलना होगा जो यह जाँचता है कि उपयोगकर्ता एक है foo

(२) इस परिदृश्य में रोल्स क्या उपयोगी मूल्य प्रदान करते हैं? क्या हम उपयोगकर्ताओं को सीधे 1+ अनुमतियाँ नहीं दे सकते हैं? अमूर्तता के क्या ठोस मूल्य रोल्स प्रदान करते हैं (क्या कोई विशिष्ट उदाहरण दे सकता है)?

भूमिकाएं अवधारणात्मक रूप से अनुमतियों के नामित संग्रह का प्रतिनिधित्व करती हैं।

मान लें कि आप एक नई सुविधा जोड़ रहे हैं, जो उपयोगकर्ता को कुछ सेटिंग्स को संपादित करने की अनुमति देता है। यह सुविधा केवल व्यवस्थापकों के लिए उपलब्ध होनी चाहिए।

यदि आप प्रति उपयोगकर्ता अनुमतियाँ संग्रहीत कर रहे हैं, तो आपको अपने डेटाबेस में सभी उपयोगकर्ताओं को ढूंढना होगा जिन्हें आप किसी तरह जानते हैं कि वे प्रशासक हैं (यदि आप उपयोगकर्ताओं के लिए भूमिका की जानकारी संग्रहीत नहीं कर रहे हैं, तो आपको यह भी कैसे पता चलेगा कि कौन से उपयोगकर्ता प्रशासक हैं?) , और संलग्न करें अनुमतियों की उनकी सूची के लिए यह अनुमति।

यदि आप भूमिकाओं का उपयोग करते हैं, तो आपको केवल Administratorभूमिका की अनुमति को संलग्न करना होगा , जो प्रदर्शन करने में आसान है, अधिक स्थान कुशल है, और गलतियों के लिए कम संभावना है।


उह? प्रमाणीकरण परत की जाँच करेगा उपयोगकर्ता वह यह है कि जो होने का दावा करता; वह परत जो
जांचती है

4
यह सभी प्रोग्रामर के लिए अनिवार्य पढ़ना चाहिए। अति उत्कृष्ट।
कोस्टा कोंटोस

2
सरल, संक्षिप्त, और इस बिंदु पर - कहीं एक पुस्तक के पूरे अध्याय को धड़कता है। धन्यवाद।
दान निसानबाम

2
स्पष्टता के लिए टिप्पणी करें (और अगर मुझसे गलती हुई है तो कृपया मुझे सही करें): एक authorization layerसंभावना का अर्थ केवल फ़ंक्शन की परिभाषा (यानी) से अधिक कुछ नहीं है user->hasPermission(SOME_PERMISSION)आंतरिक रूप से पहले उपयोगकर्ता की भूमिकाओं की जांच करें और फिर जांचें कि क्या किसी भी भूमिका में दिए गए / शामिल नहीं हैं। अनुमति। उदाहरण के लिए, the calling codeयह देखने के लिए जाँच हो सकती है कि क्या उपयोगकर्ता के लिए एक निश्चित पृष्ठ दिखाई दे रहा है और कॉल करेगा user->hasPermission(VIEW_GIVEN_PAGE), और फ़ंक्शन authorization layerकी परिभाषा में शामिल है hasPermissionजो ऊपर की भूमिकाओं की जांच करता है।
दान निसानबाम

1
@DanNissenbaum हाँ, लगता है जैसे आपको यह सही लगा, यह केवल जाँच के रूप में सरल हो सकता है यदि उपयोगकर्ताओं की भूमिका में प्राधिकरण है। यह इससे ज्यादा भी हो सकता है। उदाहरण के लिए, हो सकता है कि आपके पास उपयोगकर्ता को अस्थायी रूप से निलंबित करने का विकल्प हो और उस स्थिति में hasPermissionवह जाँच कर सके usersRole.HasPermission(VIEW_GIVEN_PAGE) && !user.Suspended। बिंदु यह सब एक ही स्थान पर किया जाता है और उपभोग (कॉलिंग) कोड में नहीं।
रोटेम

18

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

if(SecurityUtils.hasRole(developer)) {
    // Grant them access to a feature
} else if(SecurityUtils.hasRole(manager)) {
    // Grant them access to a feature
} else if...

( switchअपनी पसंद की भाषा में एक बयान बेहतर होगा, लेकिन अभी भी विशेष रूप से साफ नहीं है)

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

यदि आप केवल यह देखते हैं कि उपयोगकर्ता के पास अनुमति है जो उन्हें उदाहरण के लिए डेवलपर पोर्टल तक पहुंचने की अनुमति देता है, तो इससे कोई फर्क नहीं पड़ता कि वे क्या भूमिका रखते हैं, उन्हें एक्सेस दी जाएगी।

आपके दूसरे प्रश्न का उत्तर देने के लिए, आपके पास भूमिकाएं हैं, क्योंकि वे अनुमतियों के "पैकेज" को संशोधित करने और वितरित करने में आसान हैं। यदि आपके पास एक ऐसी प्रणाली है जिसमें सैकड़ों भूमिकाएं और हजारों अनुमतियां हैं, तो एक नया उपयोगकर्ता (उदाहरण के लिए एक नया मानव संसाधन प्रबंधक) जोड़ने से आपको गुजरने और हर एक अनुमति देने की आवश्यकता होगी जो अन्य मानव संसाधन प्रबंधक रखते हैं। न केवल यह थकाऊ होगा, लेकिन अगर इसे मैन्युअल रूप से किया जाता है, तो गलतियों का खतरा होता है। इसकी तुलना केवल "एचआर प्रबंधक" भूमिका को एक उपयोगकर्ता के प्रोफाइल में जोड़ने के लिए करें, जो उन्हें उस भूमिका के साथ हर दूसरे उपयोगकर्ता के समान एक्सेस प्रदान करेगा।

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


अच्छा उदाहरण, धन्यवाद!
फ्रैंक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.