2012-03-07 10 views
10

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

वाई में आपके पास या तो अपने व्यापार तर्क को फ़ाइलों (CPhpAuthManager) या डेटाबेस (CdbAuthManager) में डालने का विकल्प है। किसी भी तरह से, आप डेटा के रूप में अपने व्यापार तर्क का इलाज कर रहे हैं; वाईआई वास्तव में तारों के रूप में आपके व्यावसायिक तर्क को पुनर्प्राप्त करेगा और फिर इसे eval के माध्यम से चलाएगा, जो ऐसा करने के लिए एक भयानक तरीका प्रतीत होता है।

इसका कारण क्या है?

मैं जो परिणाम चाहता हूं उसे कैसे प्राप्त कर सकता हूं?

उत्तर

2

आप अपने व्यावसायिक तर्क के लिए अपने PHP कोड में जितना चाहें उतना तर्क डाल सकते हैं। वाईआई इस तर्क को जोड़ने के कई तरीकों का समर्थन करता है, उदाहरण के लिए। LoginForm.php, UserIdentity.php, SiteController.php, ... आप यहां सीमित नहीं हैं।

क्या वाईआई भी आपके आरबीएसी में तर्क का एक स्निपेट जोड़ रहा है। एक आम उपयोग केस यह है कि आप डिफ़ॉल्ट रूप से अपनी साइट के सभी उपयोगकर्ताओं को दो नियम 'प्रमाणीकृत' और 'अतिथि' असाइन करते हैं, लेकिन बिज़रूल्स के साथ। जबकि 'प्रमाणीकृत'

return !Yii::app()->user->isGuest; 

'अतिथि' की तरह एक bizRule है कि उपयोगकर्ताओं को अपने प्रवेश किए लंबे समय तक 'मेहमान' लेकिन 'प्रमाणीकृत' नहीं कर रहे हैं

return Yii::app()->user->isGuest; 

नतीजा है है। एक और उदाहरण उपयोगकर्ता प्रोफ़ाइल के लिए विचारों संपादित करें, जो केवल वर्तमान उपयोगकर्ता द्वारा संपादित किए जाने योग्य है, जैसे

return $model->id === Yii::app()->user->id; 
+0

क्या आप इसे बेहतर समझा सकते हैं? डेटाबेस में bizRules क्यों होना चाहिए, उन्हें अपने कोड में क्यों सेट नहीं करें? –

+0

जैसा ऊपर बताया गया है ... आप अपने तर्क को PHP कोड में ले जा सकते हैं, उपरोक्त परिदृश्य बड़े पैमाने पर निर्दिष्ट भूमिकाओं (या कार्य या संचालन) के साथ उपयोग-केस का वर्णन करते हैं। यदि आप 'CanEditOwnPost' जैसे किसी आइटम को चेकएप() चेक करना चाहते हैं तो आपको यह जांचना होगा कि * वर्तमान * पोस्ट उपयोगकर्ता से संबंधित है या नहीं, यह 'स्थैतिक' प्रविष्टि के साथ नहीं किया जा सकता है। या तो PHP कोड में चेक करें और फिर आइटम असाइन करें ... या अपने डेटाबेस में एक बिज़रूल जोड़ें जो यह आपके लिए जांच करता है। – schmunk

+0

यह अभी भी समझ में नहीं आता है क्योंकि डेटाबेस में कोड eval'd है। यह बेहतर होगा अगर यह नियंत्रक या कुछ में था। –

1

हो तुम क्यों कोड बनाम एक डेटाबेस में कुछ भी डाल दिया होगा?

एक अच्छा कारण यह है कि गैर-डेवलपर्स इसे संपादित कर सकते हैं।

हमारे ऐप में, हम उपयोगकर्ताओं को अपने उपयोगकर्ताओं और वस्तुओं पर अपनी अनुमतियों का प्रबंधन करने की अनुमति देते हैं।

आपको yii के आरबीएसी व्यवसाय नियमों का उपयोग करने की आवश्यकता नहीं है। आप कुछ अलग-अलग भूमिकाओं और कार्यों को कहने की अनुमति दे सकते हैं, और कोड में शेष ऑथ तर्क हैं।

+1

विचार यह है कि गैर-डेवलपर्स कोड संपादित करने से तर्क के रूप में ज्यादा समझ नहीं आती है। – hakre

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