मेरी कंपनी स्प्रिंग एमवीसी का मूल्यांकन यह निर्धारित करने के लिए कर रही है कि क्या हमें इसे अपनी अगली परियोजनाओं में से एक में उपयोग करना चाहिए। अब तक मैंने जो देखा है उससे प्यार करता हूं, और अभी मैं यह निर्धारित करने के लिए स्प्रिंग सुरक्षा मॉड्यूल पर एक नज़र डाल रहा हूं कि यह कुछ ऐसा है जिसे हम उपयोग कर सकते हैं / उपयोग करना चाहिए।
हमारी सुरक्षा आवश्यकताएँ बहुत बुनियादी हैं; एक उपयोगकर्ता को केवल उपयोगकर्ता नाम और पासवर्ड प्रदान करने में सक्षम होना चाहिए ताकि वह साइट के कुछ हिस्सों तक पहुंच सके (जैसे कि आपके खाते के बारे में जानकारी प्राप्त करने के लिए); और साइट (एफएक्यू, समर्थन, आदि) पर कुछ मुट्ठी भर पृष्ठ हैं जहां एक अनाम उपयोगकर्ता को पहुंच दी जानी चाहिए।
मेरे द्वारा बनाए जा रहे प्रोटोटाइप में, मैं एक प्रमाणीकृत उपयोगकर्ता के लिए सत्र में "LoginCredentials" ऑब्जेक्ट (जिसमें केवल उपयोगकर्ता नाम और पासवर्ड शामिल करता हूं) संग्रहीत कर रहा हूं; कुछ नियंत्रक यह देखने के लिए जाँच करते हैं कि क्या यह ऑब्जेक्ट सत्र में लॉग-इन उपयोगकर्ता नाम का संदर्भ प्राप्त करने के लिए है, उदाहरण के लिए। मैं इस होम-लॉजिक लॉजिक को स्प्रिंग सिक्योरिटी के साथ बदलना चाह रहा हूं, जिससे किसी भी प्रकार के "हम उपयोगकर्ताओं में लॉग इन कैसे ट्रैक करते हैं" को हटाने का अच्छा लाभ होगा? और "हम उपयोगकर्ताओं को कैसे प्रमाणित करते हैं?" मेरे नियंत्रक / व्यवसाय कोड से।
ऐसा लगता है जैसे स्प्रिंग सिक्योरिटी आपके उपयोगकर्ता नाम / प्रिंसिपल की जानकारी को कहीं से भी एक्सेस करने में सक्षम होने के लिए एक (प्रति-सूत्र) "संदर्भ" ऑब्जेक्ट प्रदान करती है ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... जो बहुत अन-स्प्रिंग लगता है जैसे यह वस्तु एक तरह से (वैश्विक) सिंगलटन है।
मेरा प्रश्न यह है: यदि यह स्प्रिंग सिक्योरिटी में प्रमाणीकृत उपयोगकर्ता के बारे में जानकारी प्राप्त करने का मानक तरीका है, तो एक प्रामाणिक वस्तु को SecurityContext में इंजेक्ट करने का स्वीकृत तरीका क्या है ताकि यूनिट परीक्षणों की आवश्यकता होने पर यह मेरी इकाई परीक्षणों के लिए उपलब्ध हो प्रमाणित उपयोगकर्ता?
क्या मुझे प्रत्येक परीक्षण मामले के प्रारंभ विधि में इसे तार करने की आवश्यकता है?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
यह अत्यधिक क्रिया लगती है। क्या कोई आसान तरीका है?
SecurityContextHolder
वस्तु ही बहुत अन-वसंत-तरह लगता है ...