उपयोगकर्ता @ एमडीएमए आस्पेक्ट ओरिएंटेड प्रोग्रामिंग के बारे में कुछ बताता है। इसके लिए आपको बाहरी पुस्तकालय (जैसे महान पोस्टशर्प) का उपयोग करने की आवश्यकता होगी, क्योंकि .NET में बहुत अधिक एओपी कार्यक्षमता नहीं है। तथापि, ।नेट के पास पहले से ही भूमिका आधारित सुरक्षा के लिए एओपी तंत्र है, जो आपकी समस्या का हिस्सा हल कर सकता है। मानक .NET कोड की निम्न उदाहरण को देखो:
[PrincipalPermission(SecurityAction.Demand, Role="HR")]
public List<Employees> GetAllEmployees()
{
// do stuff
}
PrincipalPermissionAttribute System.Security.Permissions नाम स्थान का हिस्सा है और नेट (.NET के बाद से 1.0) का हिस्सा है। मैं अपने वेब अनुप्रयोगों में भूमिका आधारित सुरक्षा को लागू करने के लिए पहले से ही वर्षों से इसका उपयोग कर रहा हूं। इस विशेषता के बारे में अच्छी बात यह है कि .NET JIT संकलक पृष्ठभूमि पर आपके लिए सभी बुनाई करता है और आप इसे कक्षा स्तर पर भी परिभाषित कर सकते हैं। उस स्थिति में उस प्रकार के सभी सदस्यों को उस विशेषता और इसकी सुरक्षा सेटिंग्स का उत्तराधिकारी होगा।
बेशक इसकी सीमाएं हैं। आपका दूसरा कोड नमूना .NET भूमिका आधारित सुरक्षा विशेषता का उपयोग करके लागू नहीं किया जा सकता है। मुझे लगता है कि आप वास्तव में इस विधि में कुछ कस्टम सुरक्षा जांच के आसपास नहीं आ सकते हैं, या कुछ आंतरिक सुरक्षा पुस्तकालय को बुला सकते हैं।
public Order GetMyOrder(int orderId)
{
Order o = GetOrderInternal(orderId);
BusinessSecurity.ValidateOrderForCurrentUser(o);
}
बेशक आप एक AOP ढांचे का उपयोग कर सकते हैं, लेकिन आप अभी भी एक ढांचा विशिष्ट विशेषता है कि फिर से अपनी खुद की सुरक्षा परत फोन करेगा लिखने के लिए होगा। यह केवल तब उपयोगी होगा जब ऐसी विशेषता एकाधिक विधि कॉलों को प्रतिस्थापित करेगी, उदाहरण के लिए कोड को अंदर रखने, पकड़ने, अंत में बयान देने के दौरान। जब आप एक साधारण विधि कॉल करेंगे, तो एक विधि कॉल या एकल विशेषता आईएमओ के बीच बहुत अंतर नहीं होगा।
जब आप वस्तुओं का संग्रह लौटने और जिसके लिए वर्तमान उपयोगकर्ता उचित अधिकार नहीं हैं सभी वस्तुओं बाहर फ़िल्टर करना चाहते हैं, LINQ अभिव्यक्ति पेड़ काम में आ सकता है:
public Order[] GetAllOrders()
{
IQueryable orders = GetAllOrdersInternal();
orders = BusinessSecurity.ApplySecurityOnOrders(orders);
return orders.ToArray();
}
static class BusinessSecurity
{
public static IQueryable<Order> ApplySecurityOnOrders(
IQueryable<Order> orders)
{
var user = Membership.GetCurrentUser();
if (user.IsInRole("Administrator"))
{
return orders;
}
return
from order in orders
where order.Customer.User.Name == user.Name
select order;
}
}
जब आपके हे/आरएम अभिव्यक्ति वृक्षों (जैसे एनएचबीरनेट, LINQ से SQL और इकाई फ्रेमवर्क) के माध्यम से LINQ का समर्थन करता है, आप एक बार ऐसी सुरक्षा विधि लिख सकते हैं और इसे हर जगह लागू कर सकते हैं। बेशक इसके बारे में अच्छी बात यह है कि आपके डेटाबेस की क्वेरी हमेशा अनुकूल होगी। दूसरे शब्दों में, आवश्यकतानुसार कोई और रिकॉर्ड पुनर्प्राप्त नहीं किया जाएगा।
अद्यतन (बाद के वर्षों):
मैं अपने कोड बेस में एक लंबे समय के लिए इस विशेषता का प्रयोग किया जाता है, लेकिन कई साल पहले, मैं इस निष्कर्ष पर आधारित विशेषता है कि AOP भयानक कमियां है के लिए आया था। उदाहरण के लिए, यह टेस्टेबिलिटी में बाधा डालता है। चूंकि सुरक्षा कोड को सामान्य कोड के साथ बुनाया जाता है, इसलिए आप वैध उपयोगकर्ता का प्रतिरूपण किए बिना सामान्य यूनिट परीक्षण नहीं चला सकते हैं। यह भंगुर है और इकाई परीक्षण की चिंता नहीं होनी चाहिए (इकाई परीक्षण स्वयं एकल जिम्मेदारी सिद्धांत का उल्लंघन करता है)। इसके अलावा, यह आपको उस विशेषता के साथ अपना कोड बेस कूड़ा करने के लिए मजबूर करता है।
तो PrincipalPermissionAttribute
का उपयोग करने के बजाय, मैं decorators के साथ कोड लपेटकर सुरक्षा जैसे क्रॉस-कटिंग चिंताओं को लागू करता हूं। इससे मेरा आवेदन अधिक लचीला और परीक्षण करने में बहुत आसान बनाता है। मैंने पिछले कुछ वर्षों में इस तकनीक के बारे में कई लेख लिखे हैं (उदाहरण के लिए this one और this one)।
मुझे लगता है कि आप थोड़ी देर के लिए SO पर रहे हैं। फिर भी, मैं सुझाव दूंगा कि आप शीर्षक से टैग ([.net/C#]) छोड़ दें। उन्हें टैग में रहने दें। साथ ही, "हाय" और "धन्यवाद", एक चर्चा मंच के लिए उपयुक्त होने पर, एसओ जैसे एक प्रश्नोत्तर साइट के लिए उपयुक्त नहीं हैं। धन्यवाद। –
@ जॉन ठीक है। संकेतों के लिए धन्यवाद। – gsharp