2012-04-17 10 views
5

मैं वर्तमान में पिरामिड का उपयोग कर एक छोटी पायथन वेबसाइट विकसित कर रहा हूं।
लेकिन मुझे नहीं पता कि अनुमति प्रणाली कैसे डिजाइन करें।
सिस्टम बहुत लचीला होना चाहिए: मुझे कई अलग-अलग तालिकाओं के बीच कनेक्शन स्थापित करना होगा।एक अनुमति प्रणाली को डिजाइन करने का सर्वोत्तम अभ्यास

PermissionCollection:: -
इसके बजाय सिर्फ एक तालिका बनाने के हर संस्करण मैं करने के लिए सोचा के लिए एक अनुमति तालिका लिखने की मैं इसे PermissionCollection फोन

  • permissionCollectionId - PrimaryKey
  • onType = Enum ("USER", "शिक्षक", "समूह", "बेशक" ...)
  • onId = पूर्णांक

और अनुमति तालिका:

  • PermissionId - PrimaryKey
  • कुंजी
  • मूल्य
  • permissionCollectionId - ForeignKey

मैं हर संभव संबंध स्रोतों में हार्ड-कोडेड के लिए और यदि कोई उपयोगकर्ता, ज़ाहिर मानक PermissionCollections को परिभाषित करेंगे , शिक्षक ... के पास विशेष अधिकार हैं, मैं एक नया अनुमति संग्रह बनाउंगा और इसकी अनुमति जोड़ूंगा।

मैं वेब प्रोग्रामिंग के लिए बहुत नया हूं, और यह नहीं पता कि यह दृष्टिकोण उपयोगी है या नहीं। या अगर ऐसा कुछ भी मौजूद है। मुझे लगता है कि इस काम के लिए पिरामिड एसीएल सही उपकरण नहीं है, है ना?

+0

अधिकांश RDBMSs एक 'GRANT' /' REVOKE' आदेश जो डेटाबेस में तालिकाओं/स्कीमा के लिए उपयोग (विभिन्न स्तरों पर) की अनुमति के लिए प्रयोग किया जाता है है। उनमें से कुछ में उपयोगकर्ता-समूह की अवधारणा भी है, जिसका अर्थ है कि आप पूरे समूह के लिए आदेश कर सकते हैं। तो आप एप्लिकेशन स्तर पर कुछ करने का प्रयास कर सकते हैं, जो डेटाबेस स्तर पर पहले से मौजूद है (जो अधिक सुरक्षित होगा)। –

+0

लेकिन मेरे डेटाबेस के उपयोगकर्ताओं के लिए अनुदान नहीं है? और मेरे ऐप के उपयोगकर्ता का मतलब डेटाबेस उपयोगकर्ता के लिए डेटाबेस उपयोगकर्ता –

+0

'GRANT' _is_ नहीं है, हां। लेकिन अगर आपने अनुमतियों की जांच करने के लिए अपना ऐप लिखा है (ऐप में कौन/किसने लॉग इन किया है), तो आप उन्हें एक विशिष्ट डेटाबेस उपयोगकर्ता के रूप में भी लॉग इन कर सकते हैं (आप इन्हें कनेक्शन स्ट्रिंग में आमतौर पर आपूर्ति कर सकते हैं)। जो ऑडिटिंग के साथ-साथ पहुंच को नियंत्रित करने में भी मदद करेगा। –

उत्तर

4

सुनिश्चित नहीं है कि आप इसके बारे में पहले ही पढ़ चुके हैं लेकिन पिरामिड वास्तव में एक अच्छी अनुमति प्रणाली के साथ आता है। एसीएल के साथ प्राधिकरण।

यह कैसे संभाल करने के लिए, यह वास्तव में केवल आप की निर्भर ... आप एक एसीएल तालिका

हो सकता था (object_id की अनुमति/इनकार करते हैं, कौन? (समूह, उपयोगकर्ता आईडी), अनुमति, क्रम)

  • object_id अपने डेटाबेस में
  • इनकार अनुमति देते हैं/क्या इस ऐस करने के लिए ... अनुमति दे सकेंगे या
  • जो इनकार माना जाता है एक रिकॉर्ड करने के लिए एक विशिष्ट आईडी है? है या तो एक समूह, उपयोगकर्ता नाम या जो भी आप उदाहरण system.everyone के लिए चाहते हैं हर कोई
  • है
  • अनुमति view_config में अनुमति पैरामीटर है
  • आदेश एक महत्वपूर्ण बात यह आदेश उदाहरण के लिए बात

करता है

__acl__ = [ 
(Deny, Everyone, 'view'), 
(Allow, 'group:admin', 'view') 
] 

यह नमूना हमेशा व्यवस्थापक के लिए भी दृश्य को अस्वीकार कर देगा ... जैसे ही पिरामिड कुछ ऐसा ढूंढता है जो आपको बताता है कि क्या आप रिकॉर्ड देख सकते हैं या नहीं देख सकते हैं, यह स्वचालित रूप से

खोजना बंद कर देता है
__acl__ = [ 
(Allow, 'group:admin', 'view'), 
(Deny, Everyone, 'view') 
] 

यह प्रत्येक व्यवस्थापक के लिए दृश्य की अनुमति देगा लेकिन किसी और के लिए नहीं।यही कारण है कि आपको अपने एसीई के आदेश को याद रखना होगा।

मजेदार हिस्सा वास्तव में यहां है। यह सब अच्छा है। आपके पास आपके डेटा में रिकॉर्ड के लिए एसीएल मैप किया गया है। जब आप उदाहरण के लिए एक पृष्ठ लोड करते हैं ... आपको एसीएल लोड करना होगा और उन्हें अपनी ऑब्जेक्ट में सेट करना होगा।

myobject.__acl__ = load_acls(myobject) 

यदि आपके पास डेटा पेड़ है। आप एसीएल भी सेट नहीं कर सकते हैं।

उदाहरण के लिए आप एक साइट है कि कि

root 
    \--pages with acl 
     +---- page1 without acl 
     \---- page2 with acl 

की तरह लग रहा है, तो आप पृष्ठ 1 का उपयोग करेंगे है, यह एसीएल अगर यह यह नहीं मिल सकता है, इसके लिए जाँच करेगा के लिए जाँच करेगा पैरेंट यदि पैरेंट में एसीएल है, तो यह इसके लिए अनुमति की जांच करेगा, अगर यह रूट तक पहुंचने तक पैरेंट की जांच नहीं करेगा। अगर यह अनुमति नहीं मिल पाती है, तो मुझे यकीन नहीं है कि क्या होता है .. मुझे लगता है कि यह आपको या तो एक वर्जित त्रुटि या त्रुटि त्रुटि देगा। यह उचित दृश्य नहीं मिल रहा है।

उस काम को करने के लिए आपको स्थान जागरूक वस्तु बनाना है जो उनके माता-पिता को जानता है।

लेकिन आप ऐसा क्यों करना चाहते हैं?

आप किसी ऑब्जेक्ट के लिए एसीएल प्राप्त कर सकते हैं और वास्तव में अच्छी तरह से दाग नियंत्रण कर सकते हैं कि आपके डेटाबेस में कौन सा ऑब्जेक्ट देख सकता है या नहीं। आप डेटाबेस के बिना सीधे अपने क्लास ऑब्जेक्ट में एसीएल डाल सकते हैं।

जब तक आपका एसीएल विशेषता में एसीएल पिरामिड इसके साथ कुछ करने में सक्षम होगा। यह वास्तव में महत्वपूर्ण नहीं है कि आपको यह कैसे मिला।

इस चेक बाहर

http://pyramid.readthedocs.org/en/1.3-branch/tutorials/wiki/authorization.html

+0

अच्छा। धन्यवाद। और मैं अपनी मेज का भी उपयोग कर सकता था? आपके दृष्टिकोण में: एप्लिकेशन कैसे पता लगा सकता है कि कौन: 1 आईडी के साथ आईडी 1 एक समूह वाला उपयोगकर्ता है? तो, मैं सिर्फ एक ऐसा फ़ंक्शन लिखता हूं जो ट्रैवलल पेड़ में प्रत्येक तत्व के लिए इस एसीएल ट्यूपल उत्पन्न करता है। क्या मैं सिर्फ नियंत्रक में एसीएल लोड कर सकता हूं? –

+0

ओडर का उद्देश्य क्या है? –

+0

हाँ आप कहीं भी एसीएल लोड कर सकते हैं जब तक कि आपका उदाहरण __acl__ टुपल (एसीई) की सूची में सेट हो। –

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