2013-03-18 6 views
7

मैं कोडवसंत सुरक्षा में मैन्युअल प्रमाणीकरण तर्क कहां जाना चाहिए - सेवा परत या प्रस्तुति परत?

UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email); 
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities()); 
SecurityContext securityContext = SecurityContextHolder.getContext(); 
securityContext.setAuthentication(authentication); 
HttpSession session = request.getSession(true); 
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext); 

के इस टुकड़े है यह मैन्युअल रूप से वसंत सुरक्षा में एक उपयोगकर्ता को प्रमाणित करने के लिए है। मेरा प्रश्न है कि मुझे यह कोड कहां रखना चाहिए? सेवा परत में इसे रखने से मुझे HttpSession ऑब्जेक्ट को सेवा परत पर लाने के लिए मजबूर किया जाता है जो AFAIK खराब है। मुझे यकीन नहीं है कि प्रस्तुति परत में प्रमाणीकरण तर्क को कितना अच्छा लगा है। किसी भी अंतर्दृष्टि के साथ कोई भी ??

अग्रिम धन्यवाद।

+0

erm, सर्वलेट फ़िल्टर मानक है, क्या आपने जानबूझकर इसे किसी कारण से केवल दो विकल्पों में बाध्य किया है? – Affe

+0

तो क्या मुझे एक कस्टम फ़िल्टर लिखना है? अभी तक यह एक सादा अनुरोध है। मुझे उस कॉल के अंदर तर्क को समायोजित करना होगा। – shazinltc

+0

यदि आप केवल मूल प्रमाणीकरण का उपयोग करते हैं तो आप बस अपने लिए इसे संभालने के लिए बसंत को कॉन्फ़िगर कर सकते हैं। – benzonico

उत्तर

14

स्प्रिंग सुरक्षा से आपके कोड को डीकॉप्ल्ड करते समय इस प्रकार की चीजों को करने के लिए कस्टम इंटरफ़ेस बनाने के लिए डिज़ाइन तर्क के लिए ल्यूक टेलर के प्रश्न Best practice for getting active user's UserDetails? पर उत्तर दें। उदाहरण के लिए, आप MyAuthenticator नामक एक इंटरफ़ेस लिख सकते हैं और कार्यान्वयन लिख सकते हैं और इसे अपने एप्लिकेशन में इंजेक्ट कर सकते हैं।

यदि आपके वसंत सुरक्षा फ़िल्टर मानक हैं तो आपको HttpSession ऑब्जेक्ट तक पहुंचने की आवश्यकता नहीं है। फ्रेमवर्क फिल्टर इसका ख्याल रखेंगे। के रूप में यह ढांचा के भविष्य के संस्करणों में बदल सकता है

UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email); 

Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities()); 

SecurityContextHolder.getContext().setAuthentication(authentication); 

मैं "SPRING_SECURITY_CONTEXT" उपयोग करने की अनुशंसा नहीं होता (HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY): तुम बस अपने कार्यान्वयन में निम्नलिखित लिखने के लिए की है।

+1

सही !! बहुत धन्यवाद ... – shazinltc

+0

क्या आप स्पष्ट कर सकते हैं कि "वसंत सुरक्षा फ़िल्टर मानक हैं" से आपका क्या मतलब है? – swbandit

+0

मतलब यह है कि कोई एप्लिकेशन विशिष्ट फ़िल्टर अनुकूलन नहीं है जो उस पर असर डालता है ... विशेष रूप से 'SecurityContextPersistenceFilter' जो 'SecurityContextHolder' को पॉप्युलेट करने के लिए ज़िम्मेदार है। – Ritesh

संबंधित मुद्दे