2013-02-15 12 views
5

की रिपोजिटरी परत में प्रमाणीकरण करने के लिए पैटर्न मेरे पास एक रजिस्ट्री परत के साथ एक विंडोज प्रमाणीकृत एमवीसी अनुप्रयोग है। डेटाबेस के साथ नियंत्रक द्वारा सभी बातचीत भंडार के माध्यम से किया जाता है। प्रत्येक नियंत्रक भंडार के लिए एक संदर्भ है:एमवीसी अनुप्रयोग

public class PostController : Controller 
{ 
    private Repository db = new Repository(); 

    [HttpPost] 
    public ActionResult DeletePost(int id) 
    { 
     // Authorize that the user is allowed to delete this post... 

     db.DeletePost(id); 
    } 
} 

मेरा प्रश्न वहाँ भंडार परत में मेरे प्राधिकरण के तर्क को स्थानांतरित करने के लिए एक अच्छा तरीका है कि क्या है। मैं Repository.DeletePost() फ़ंक्शन को प्रमाणीकृत उपयोगकर्ता द्वारा बनाए गए पोस्ट को हटाने से इनकार करने के लिए चाहता हूं। समस्या यह है कि मेरा भंडार नहीं जानता कि प्रमाणीकृत उपयोगकर्ता कौन है। नियंत्रक जानता है (Controller.User के माध्यम से)।

Repository निर्माता में Controller.User पासिंग काम नहीं करता, क्योंकि Controller.User जाहिरा तौर पर समय निर्धारित नहीं है जब निर्माता कहा जाता है।

कैसे मैं कौन प्रमाणित उपयोगकर्ता की Repository सूचित कर सकते हैं? क्या प्रत्येक कार्रवाई के भीतर Repository बनाने के लिए सबसे अच्छा होगा? या क्या यह भंडार परत में इसे संभालने का बुरा विचार है?

db.DeletePostForUser(id, User.Identity.UserId); 
फिर अपने भंडार में

:

उत्तर

1

दोनों @BigDaddy और @ChrisPratt से अच्छा सुझाव।

मैं एक आधार नियंत्रक, this answer के समान बनाने के द्वारा इस सुलझाने समाप्त हो गया।

public class BaseController : Controller 
{ 
    private ILog _log; 
    private Repository _db; 

    protected Repository Db 
    { 
     get 
     { 
      return _db ?? (_db = new Repository(User)); 
     } 
    } 

    protected ILog Log 
    { 
     get 
     { 
      return _log ?? (_log = LogManager.GetLogger(this.GetType())); 
     } 
    } 
} 

मेरी नियंत्रकों के सभी इस वर्ग से विरासत है, और करने के लिए निर्मित पहुँच है एक आलसी-लोडेड Repository वर्तमान में प्रमाणित उपयोगकर्ता के लिए एक संदर्भ है कि: मेरा आधार नियंत्रक वर्ग की तरह दिखता है।

+0

यह वास्तव में मैं कर रहा हूं, लेकिन मुझे लगता है कि इसमें पर्याप्त "decoupling" नहीं है क्योंकि अब हमारे भंडार हमारे उपयोगकर्ता से बंधे हैं, जो किसी प्रकार का व्यवस्थापक हो सकता है जो तब तक कुछ भी करने में सक्षम नहीं होगा जब तक आप खाते नहीं थे इसके लिए हर कदम पर – Worthy7

1

वैसे ही जैसे कुछ करना

public void DeletePostForUser(int id, int userId) 
{ 
    var post = context.Posts.SingleOrDefault(m => m.PostId == id && m.User.UserId == userId) 
    if (post != null) 
    { 
     context.Posts.Remove(post); 
     context.SaveChanges(); 
    } 
} 
+0

सुझाव अच्छा है ... मैं कुछ और के साथ जा रहा है, क्योंकि जब मैं पता है, जो 'User' है चाहता हूँ कि मेरे भंडार में कई बार हो सकता है समाप्त हो गया है, और मैं यह करने के लिए इतने सारे हस्ताक्षर जोड़ने से बचना चाहते हैं । – Eric

+1

@ क्रिस लेकिन क्या हमारे प्रतिनिधि प्राधिकरण कार्य कर रहे हैं? – uriDium

+0

मूल रूप से, @uriDium सही है, भंडार केवल प्राप्त करने और सेटिंग के लिए हैं। वे वहां से सुरक्षित नहीं हैं कि कौन से उपयोगकर्ता इसे कर रहे हैं। वह डोमेन का काम है। किसी व्यवस्थापक द्वारा डेटाबेस में अचानक कुछ बदलाव करने की आवश्यकता होने पर क्या होगा? इससे कोई फर्क नहीं पड़ता, अगर आप एक्सेस प्रतिबंधित करना चाहते हैं तो आप नियंत्रकों में निचले स्तर पर पहुंच प्रतिबंधित कर सकते हैं। फिर सर्विस लेयर (जो नियंत्रक में हो सकता है) यह सत्यापित करने का काम करेगा कि क्या उपयोगकर्ता इन परिवर्तनों को कर सकता है (भले ही इसमें कुछ अजीब कारणों से डेटाबेस को कॉल करना शामिल हो) – Worthy7

3

या यह एक बुरा विचार यह भंडार परत में संभाल करने के लिए है?

मुझे लगता है कि नियंत्रक आपके प्राधिकरण के लिए एक बेहतर जगह है। भंडार डेटा के लिए प्रवेश द्वार बनें और नियंत्रक आपके आवेदन के लिए द्वारपाल बनें। मैं जितना संभव हो सके जीवन चक्र के रूप में प्रमाणीकरण/प्रमाणीकरण तर्क देखने की उम्मीद करता हूं।

+0

मैं इसकी सराहना कर सकता हूं ... मैं यह देखने जा रहा हूं कि यह मेरे प्राधिकरण तर्क को भंडार में कैसे लगा रहा है। अगर यह गंदे लग रहा है, तो मैं शायद आपके सुझाव पर वापस आऊंगा। – Eric

+0

मेरे पास वेबइंटरफेस और वेब सेवा, के साथ एक प्रणाली है, मुझे निश्चित रूप से दो प्रमाणीकरण तर्क की आवश्यकता है, लेकिन मैं प्राधिकरण कोड को डुप्लिकेट नहीं करना चाहता ... आप इसे कैसे हल करते हैं? –

+1

यदि आप दोनों स्तरों पर अधिकृत नहीं हैं, तो आप और कैसे पहुंच को नियंत्रित कर सकते हैं? आप शायद यूआई परत पर प्रमाणित करना चाहते हैं और सेवा परत पर प्रमाणीकरण सत्यापित करना चाहते हैं। फिर, यूआई और सेवा परत पर अधिकृत करें। –

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