मैं अपने इंटरफ़ेस डिज़ाइन को देख रहा हूं और मैं यह तय करने के लिए संघर्ष कर रहा हूं कि रोल-आधारित एक्सेस कंट्रोल को लागू करने के लिए सबसे "सही" तरीका क्या है, एक userऔर subjectजिसे userएक्सेस करना चाहते हैं।
जहां तक मैं देख सकता हूं कि मेरे पास तीन मुख्य विकल्प हैं (एक चौथे के साथ पहले तीन का एक बार्डरडाइजेशन है और एक पांचवें का चौथा होने के कारण):
- उन
subjectअनुमतियों की सूची के साथ क्वेरी करें जिनमेंuser-subject.allowAccess(user.getPermissionSet) - उन
userअनुमतियों की सूची के साथ क्वेरी करें जिनकीsubjectआवश्यकता है -user.hasPermissionTo(subject.getRequiredPermissions()) - अनुमतियों के चौराहों का पता लगाने के लिए एक तृतीय-पक्ष क्वेरी करें -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) - तृतीय पक्ष वर्ग के "निर्णय" को प्रस्तुत करते हुए क्वेरी या तो
subject/user - यदि एक्सेस की अनुमति नहीं है, तो किसी त्रुटि
userको एक्सेस करनेsubjectऔर फेंकने का प्रयास करें
मैं विकल्प चार की ओर झुक रहा हूं - क्या subjectकोई accessControllerफ़ील्ड शामिल है , जहां subject.userMayAccess(User user)ऑपरेशन को ला को कॉल करने के लिए कॉल किया गया है:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. लेकिन फिर इससे और सवाल खड़े होते हैं:
accessControllerएक क्षेत्र बनाम एक स्थिर वर्ग होना चाहिए ..?subjectपता होना चाहिए कि इसे देखने के लिए किन अनुमतियों की आवश्यकता है?- कॉलिंग के संबंध में कम से कम ज्ञान का सिद्धांत कहां से आता है
subject.display()? क्याsubject.display()कभी कॉल करने वालों को पता होना चाहिए कि एक्सेस कंट्रोल लागू है? (जहांsubject.display()एक अंतिम "टेम्पलेट विधि" है) - है
subject.display()अभिगम नियंत्रण प्रबंधन, एक अपवाद है, जहां उपयोगकर्ता के लिए आवश्यक अनुमति नहीं है फेंक?
इस स्थिति में "सर्वश्रेष्ठ अभ्यास" क्या माना जाएगा? वास्तव में चेक के प्रदर्शन की जिम्मेदारी कहां होनी चाहिए?
जैसा कि यह कुछ हद तक एक अकादमिक बहिष्कार है जो फिर कार्यान्वयन में प्रगति करेगा, डिजाइन पैटर्न के संदर्भ की सराहना की जाएगी।