मैं अपने इंटरफ़ेस डिज़ाइन को देख रहा हूं और मैं यह तय करने के लिए संघर्ष कर रहा हूं कि रोल-आधारित एक्सेस कंट्रोल को लागू करने के लिए सबसे "सही" तरीका क्या है, एक 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()
अभिगम नियंत्रण प्रबंधन, एक अपवाद है, जहां उपयोगकर्ता के लिए आवश्यक अनुमति नहीं है फेंक?
इस स्थिति में "सर्वश्रेष्ठ अभ्यास" क्या माना जाएगा? वास्तव में चेक के प्रदर्शन की जिम्मेदारी कहां होनी चाहिए?
जैसा कि यह कुछ हद तक एक अकादमिक बहिष्कार है जो फिर कार्यान्वयन में प्रगति करेगा, डिजाइन पैटर्न के संदर्भ की सराहना की जाएगी।