प्रस्तावना: यह दार्शनिक प्रश्न का थोड़ा सा है। मैं ऐसा करने के लिए "ए" तरीके के बजाय ऐसा करने के "सही" तरीके के लिए और अधिक देख रहा हूं।एएसपी.नेट एमवीसी में एक्सेस कंट्रोल?
की कल्पना मैं कुछ उत्पादों चलाते हैं और एक ASP.NET MVC आवेदन उन उत्पादों पर CRUD प्रदर्शन: -
mysite.example/products/1
mysite.example/products/1/edit
मैं भंडार पैटर्न का उपयोग कर रहा है, तो यह कोई बात नहीं है, जहां इन उत्पादों आ से: -
public interface IProductRepository
{
IEnumberable<Product> GetProducts();
....
}
इसके अलावा मेरे भंडार उपयोगकर्ताओं की ऐसी सूची है, और जो उत्पादों वे (उपयोगकर्ता और उत्पाद के बीच कई-कई) के लिए प्रबंधकों को बताया गया है। आवेदन में कहीं और, एक सुपर-एडमिन उपयोगकर्ताओं पर सीआरयूडी कर रहा है और उपयोगकर्ताओं और उत्पादों के बीच संबंधों का प्रबंधन कर रहा है जिन्हें उन्हें प्रबंधित करने की अनुमति है।
किसी को भी किसी उत्पाद को देखने की अनुमति है, लेकिन केवल उन उपयोगकर्ताओं को जिन्हें किसी विशेष उत्पाद के लिए "व्यवस्थापक" के रूप में नामित किया गया है, को आमंत्रित करने की अनुमति है। संपादन कार्रवाई।
कैसे मुझे एएसपी.नेट एमवीसी में लागू करने के बारे में जाना चाहिए? जब तक मुझे कुछ याद नहीं आया, मैं अंतर्निहित एएसपी.NET प्राधिकरण विशेषता का उपयोग नहीं कर सकता क्योंकि पहले मुझे प्रत्येक उत्पाद के लिए एक अलग भूमिका की आवश्यकता होगी, और दूसरा मुझे नहीं पता कि मेरी भूमिका तक जांचने के लिए कौन सी भूमिका है रिपोजिटरी से मेरा उत्पाद पुनर्प्राप्त किया।
जाहिर है आप इस परिदृश्य से अधिकांश सामग्री-प्रबंधन परिदृश्यों में सामान्यीकृत कर सकते हैं - उदा। उपयोगकर्ताओं को केवल अपने फोरम पोस्ट को संपादित करने की अनुमति है। StackOverflow उपयोगकर्ता केवल अपना स्वयं प्रश्नों को संपादित करने की अनुमति है - जब तक वे 2000 या अधिक प्रतिनिधि ...
सरल समाधान मिल गया है, एक उदाहरण के रूप, की तरह कुछ होगा: -
public class ProductsController
{
public ActionResult Edit(int id)
{
Product p = ProductRepository.GetProductById(id);
User u = UserService.GetUser(); // Gets the currently logged in user
if (ProductAdminService.UserIsAdminForProduct(u, p))
{
return View(p);
}
else
{
return RedirectToAction("AccessDenied");
}
}
}
मेरे मुद्दों : - (SetStock, आदेश, CreateOffer अद्यतन, हटाएँ,) उपयोगकर्ता-उत्पाद संबंध पर निर्भर करता है की कल्पना कई आपरेशनों देखते हैं
- इस कोड में से कुछ दोहराया जा करने की आवश्यकता होगी। आपको कई बार कॉपी-पेस्ट करना होगा।
- यह बहुत टेस्टेबल नहीं है - आपको प्रत्येक परीक्षण के लिए मेरी गिनती चार ऑब्जेक्ट्स द्वारा नकली करना होगा।
- यह वास्तव में नियंत्रक की "नौकरी" की तरह प्रतीत नहीं होता है कि यह जांचने के लिए कि उपयोगकर्ता को कार्रवाई करने की अनुमति है या नहीं। मैं बल्कि अधिक प्लग करने योग्य (उदा। गुणों के माध्यम से एओपी) समाधान होगा। हालांकि, क्या इसका जरूरी अर्थ यह होगा कि आपको उत्पाद को दो बार चुनना होगा (एक बार प्राधिकरण फ़िल्टर में, और फिर नियंत्रक में)?
- यदि उपयोगकर्ता को यह अनुरोध करने की अनुमति नहीं है तो 403 वापस करना बेहतर होगा? यदि हां, तो मैं ऐसा करने के बारे में कैसे जाऊं?
मैं शायद इसे अद्यतन रखूंगा क्योंकि मुझे अपने विचार मिलते हैं, लेकिन मैं आपका सुनने के लिए बहुत उत्सुक हूं!
अग्रिम धन्यवाद!
संपादित
बस यहाँ विस्तार का एक सा जोड़ने के लिए। मेरे पास जो मुद्दा है वह यह है कि मैं व्यवसाय नियम चाहता हूं "केवल अनुमति वाले उपयोगकर्ता ही एक ही स्थान पर निहित होने के लिए अनुमति दे सकते हैं"।मुझे लगता है कि वही कोड जो निर्धारित करता है कि कोई उपयोगकर्ता संपादन कार्रवाई में प्राप्त या पोस्ट कर सकता है, यह निर्धारित करने के लिए भी जिम्मेदार होना चाहिए कि इंडेक्स या विवरण दृश्यों पर "संपादन" लिंक प्रस्तुत करना है या नहीं। हो सकता है कि संभव/संभव नहीं नहीं है, लेकिन मुझे लगता है कि यह होना चाहिए ...
संपादित 2
इस पर एक इनाम शुरू। मुझे कुछ अच्छे और सहायक उत्तर मिल गए हैं, लेकिन कुछ भी नहीं जो मुझे "स्वीकार करने" में सहज महसूस करता है। ध्यान रखें कि मैं व्यापार तर्क रखने के लिए एक अच्छी साफ विधि की तलाश में हूं जो यह निर्धारित करता है कि इंडेक्स व्यू पर "संपादित करें" लिंक उसी स्थान पर प्रदर्शित किया जाएगा जो यह निर्धारित करता है कि उत्पाद/अनुरोध के लिए अनुरोध है या नहीं/1 अधिकृत है या नहीं। मैं प्रदूषण को अपनी क्रिया विधि में पूर्ण न्यूनतम तक रखना चाहता हूं। आदर्श रूप से, मैं एक विशेषता-आधारित समाधान की तलाश में हूं, लेकिन मैं स्वीकार करता हूं कि यह असंभव हो सकता है।
क्या आपके पास एक उदाहरण है या एमवीसी ऐप में एसीएल-आधारित सुरक्षा का उपयोग करता है? –
हमें एक सूची रखने की ज़रूरत क्यों है? मैं एक ही परिस्थिति में हूं लेकिन मैं उन उपयोगकर्ताओं की एक पूरी सूची संग्रहित नहीं करना चाहता जो उत्पाद को संपादित कर सकें। यदि कोई उपयोगकर्ता कोई उत्पाद संपादित कर सकता है तो मैं केवल तेज़ी से देखना चाहता हूं (दृश्यों के साथ-साथ सेवा परत विधियों के लिए)। और तुलना बस "उपयोगकर्ताओं को अपने उत्पाद का मालिक है"। हमें पूरी सूचियों को संग्रहित करने की आवश्यकता क्यों है? – Worthy7