2008-11-10 17 views
5

मैं एक रेल वेब एप्लिकेशन पर काम कर रहा हूं, और वर्तमान में इसका उपयोग कुछ 20 उपयोगकर्ताओं द्वारा किया जा रहा है।वेब एप्लिकेशन के लिए जुर्माना प्राधिकरण को लागू करने का सबसे अच्छा तरीका?

एप्लिकेशन के कुछ हिस्सों केवल कुछ उपयोगकर्ताओं द्वारा ही पहुंच योग्य हैं, इसलिए हमारे पास पहले से ही एक बुनियादी प्राधिकरण ढांचा है, जिसे मैंने act_as_authenticated प्लगइन का उपयोग करके लागू किया है।

उपयोगकर्ता के विशेषाधिकार इस बात पर निर्भर करते हैं कि वे किस विभाग में काम करते हैं, इसलिए उदाहरण के लिए प्रशासन के पास आवेदन के सभी हिस्सों तक पहुंच है, जबकि लेखांकन के पास केवल लेखांकन से संबंधित भागों तक पहुंच है, और बिक्री केवल बिक्री से संबंधित है भागों, आदि

दूसरी तरफ, उपयोगकर्ता उन कार्यों के लिंक देखते हैं जिनके लिए उनके पास अपर्याप्त विशेषाधिकार हैं। उदाहरण के लिए, बिक्री विभाग में उन लोगों को मुख्य मेनू में वित्तीय रिकॉर्ड का एक लिंक दिखाई देता है, लेकिन जब वे उस पर क्लिक करते हैं, तो कुछ भी नहीं होता है। ऐसा इसलिए है क्योंकि AFAIK act_as_authenticated का उपयोग कर उपयोगकर्ता विशेषाधिकारों से पूछने का कोई प्रभावी तरीका नहीं है।

मैं दो तरीकों से बदलना चाहते हैं:

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

  2. मैं उपयोगकर्ता विशेषाधिकारों को कुशलता से पूछने में सक्षम होना चाहता हूं, इसलिए मैं इंटरफ़ेस से अनावश्यक (और भ्रमित) लिंक हटा सकता हूं।

आपको यह लागू करने का सबसे शानदार तरीका क्या है?

रेल-विशिष्ट उत्तरों आवश्यक नहीं हैं, मैं सिर्फ यह जानना चाहता हूं कि डेटा-संचालित एप्लिकेशन में इसे कैसे कार्यान्वित किया जाना चाहिए।

अंत में, यहाँ है कि यह कैसे वर्तमान में लागू है:

def authorized? 
    current_user.role.foo? or current_user.role.bar? 
end 

और यहाँ मेरी प्रारंभिक विचार है, जो मुझे लगता है कि इस को हल करने के लिए सबसे अच्छा तरीका नहीं है:

 
+------------+------------+---------+ 
| department | controller | action | 
+------------+------------+---------+ 
| accounting | payments | index | 
| accounting | payments | new  | 
| accounting | payments | create | 
| accounting | payments | edit | 
| accounting | payments | update | 
| accounting | payments | destroy | 
| sales  | payments | new  | 
| sales  | payments | create | 
| sales  | payments | edit | 
| sales  | payments | update | 
+------------+------------+---------+ 

या

 
+------------+----------+-------+--------+------+--------+--------+ 
| department | model | list | create | read | update | delete | 
+------------+----------+-------+--------+------+--------+--------+ 
| accounting | payments | TRUE | TRUE | TRUE | TRUE | TRUE | 
| sales  | payments | FALSE | TRUE | TRUE | TRUE | FALSE | 
+------------+----------+-------+--------+------+--------+--------+ 

उत्तर

3

प्रमाणीकरण की मूल अवधारणा, जैसा कि मैं इसे समझता हूं, एक भूमिका है। करने के लिए एक पूरे के रूप

  1. प्रणाली के लिए एक उपयोगकर्ता के संबंध संस्थाओं के कुछ प्रकार (उदाहरण के लिए एक उपयोगकर्ता की
  2. संबंध: भूमिका विभिन्न बातें व्यक्त कर सकते हैं (उदाहरण के लिए प्रणाली के व्यवस्थापक बनना।)। टिप्पणियों का एक मॉडरेटर बनें)
  3. किसी विशेष इकाई (उदाहरण के लिए कुछ संसाधनों के मालिक होने के लिए) के संबंध में
  4. कुछ अन्य जटिल संबंध (उदाहरण के लिए। ऐसे उपयोगकर्ता का मित्र बनें जो मालिक है कुछ संसाधन)
  5. कि उपयोगकर्ता के पास कुछ विशेषता है या यह कुछ कणों में कुछ संदेश का जवाब देती है आर रास्ता (उदाहरण के लिए। एक किशोर होने के लिए)

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

प्राधिकरण का दूसरा भाग एक तंत्र है जो यह तय करता है कि कोड का कौन सा हिस्सा चलाना है (या चलाने के लिए नहीं) तथ्य यह है कि यदि उपयोगकर्ता कुछ भूमिका (भूमिकाओं का सेट) में फिट बैठता है या नहीं। इस तंत्र को लागू करने के लिए, हमें उन बिंदुओं को ढूंढना होगा जहां प्राधिकरण होना चाहिए और उन भूमिकाओं का चयन करना जिनके लिए कोड चलाना चाहिए या नहीं होना चाहिए।

रेल में मेरे लिए काम करने का तरीका मॉडल स्तर पर भूमिकाओं को परिभाषित करना और प्राधिकरण तंत्र छोड़ना (कोड के उन हिस्सों के लिए अनुमति की भूमिका निभाना है जिन्हें मैं अधिकृत करना चाहता हूं और पूछ रहा हूं कि वर्तमान उपयोगकर्ता की भूमिका है या नहीं भाग को चलाने के लिए) पूरी तरह से नियंत्रकों/विचारों के लिए।

इसके लिए मैं tweaked रेल-प्राधिकरण-प्लगइन का उपयोग करता हूं जिसमें सभी संभावनाएं हैं जिनका मैंने अभी उल्लेख किया है (विभिन्न प्रकार की भूमिकाएं, एक उपयोगकर्ता के लिए कई भूमिकाएं, नियंत्रक पर प्राधिकरण और दृश्य स्तर)।

0

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

इसी तरह की स्थिति/समाधान वर्णित here

0
अपने दो प्रस्तावों के

, पहला विकल्प के रूप में यह आप कार्रवाई से है जो मॉडल-स्तरीय कार्रवाइयों नहीं हो सकता है जोड़ने की अनुमति देता बेहतर थोड़ा लग रहा है। मुझे लगता है कि आप एक ऐसे मामले में भाग लेंगे जहां दूसरा मॉडल पर्याप्त नहीं करता है, और आपको या तो स्कीमा को बदलना होगा या अपने ऐप में एक्सप्रेशन लॉजिक को छिड़कना शुरू करना होगा (उदा।

कारण समाधान बहुत शुष्क पुनरावृत्ति नहीं है वह यह है कि नहीं लगता है "के बिना उपयोगकर्ता पहुँच भी 'बनाने' विधि xxx नहीं चला सकते हैं") मुझे लगता है कि:

  1. विभाग के नाम में, और
  2. विभाग क्षमताओं

# 1 के संबंध में, यह एक विभागों तालिका बना सकते हैं और प्रत्येक विभाग के एक आईडी देने के लिए मतलब होगा।

# 2 के संबंध में, मैं पहली टिप्पणी से सहमत हूं। आप संभवतः विभिन्न नियंत्रकों और कार्यों को कार्यात्मक समूहों में क्लस्टर कर सकते हैं, और फिर उपयोगकर्ताओं और कार्यों के बीच कई रिश्तों (मैपिंग टेबल) को सेट कर सकते हैं। कार्यों के बाद उनके द्वारा किए जाने वाले कार्यों/नियंत्रकों के साथ एक से अधिक संबंध होंगे। यह आपको कम से कम पुनरावृत्ति के साथ, "लेखा और बिक्री जैसी सभी वित्तीय तालिकाओं को पढ़ने में सक्षम होना चाहिए" कहेंगे।

+0

मेरे पास पहले से ही एक विभाग तालिका है, और उपयोगकर्ता_डिमेंट्स तालिका है। मैंने ब्रेवटी के लिए उदाहरण तालिका को सरल बना दिया। –

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

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