2011-07-05 22 views
5

के साथ ऑटो लॉगिन मेरे पास एक ऐसा एप्लिकेशन है जो वसंत-सुरक्षा का उपयोग करता है। मेरी साइनअप प्रक्रिया में, एक नई उपयोगकर्ता इकाई को हैश किए गए पासवर्ड के साथ जारी रखा जाता है, एक सक्रियण टोकन वाला ईमेल उपयोगकर्ता को भेजा जाता है। इस टोकन पर क्लिक करने से उपयोगकर्ता को UserActivationServlet पर निर्देशित किया जाता है जो उपयोगकर्ता को टोकन द्वारा देखता है, उपयोगकर्ता को सक्रिय करता है और उन्हें एप्लिकेशन पर रीडायरेक्ट करता है। मैं अपने आप आवेदन में उपयोगकर्ता लॉग ऑन करना चाहते हैं और मेरे सर्वलेट में इस विधि यहाँ इसवसंत सुरक्षा

private void authenticateUserAndSetSession(HttpServletRequest request, User u) { 
    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
      u.getUsername(), u.getPassword()); //PROBLEM: THIS PASSWORD IS HASHED 

    // generate session if one doesn't exist 
    request.getSession(); 

    token.setDetails(new WebAuthenticationDetails(request)); 
    Authentication authenticatedUser = authenticationManager.authenticate(token); 

    SecurityContextHolder.getContext().setAuthentication(authenticatedUser); 
    request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, 
      SecurityContextHolder.getContext()); 
} 

समस्या क्या करने के लिए कब बनाया गया था कि कि उपयोगकर्ता इकाई पर पासवर्ड फ़ील्ड टुकड़ों में बांटा गया है शामिल किया है। तो एकमात्र अन्य विकल्प जिसे मैं सोच सकता हूं, अनहेश पासवर्ड को सर्वलेट (अनुरोध!)

क्या मुझे कुछ याद आया है, क्या उपयोगकर्ता को प्री-प्रामाणिक करने का कोई और तरीका है?

धन्यवाद

+1

मैं यहाँ बेवकूफ किया जा रहा था, उपयोगकर्ता सक्रियण लिंक पर क्लिक किया गया है और हम ध्यान दिया है उसे इतनी स्पष्ट रूप से ऊपर एक वैध उपयोगकर्ता है, तो कोई नहीं है प्रमाणीकरण प्रबंधक के साथ उसे फिर से प्रमाणीकृत करने की आवश्यकता है और इसलिए टोकन बनाते समय क्रेडेंशियल्स का उपयोग करने की आवश्यकता नहीं है, बस इसे निम्नानुसार बनाएं: पूर्व प्रमाणीकृत प्रमाणीकरण टोकन टोकन = नया पूर्व प्रमाणीकृत प्रमाणीकरण टोकन ( पी, शून्य, पी .get प्राधिकरण()); –

+0

एक और समान प्रश्न (और उत्तर) यहां पाया जा सकता है: http://stackoverflow.com/a/12057327/26510 –

+1

@ClintonBosch आप टिप्पणी के रूप में टिप्पणी लिख सकते हैं और इसे स्वीकार कर सकते हैं – fglez

उत्तर

3

उपयोगकर्ता सक्रियण लिंक पर क्लिक किया गया है और हम उसे देखा है तो स्पष्ट रूप से हम एक मान्य उपयोगकर्ता है, तो कोई ज़रूरत नहीं है करने के लिए टोकन बनाते समय क्रेडेंशियल्स का उपयोग करने की कोई जरूरत authenticationManager और इतने के साथ उसे पुन: प्रमाणीकृत, बस इस प्रकार के रूप में बनाना:

PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken(p, null, p.getAuthorities()); 
0

अगर मैं तुम्हें सही ढंग से समझ SOA आप कर सकते हैं।

आपको लॉगिन पेज पर रीडायरेक्ट करने की आवश्यकता नहीं है, बल्कि उपयोगकर्ता को लॉग इन करने वाली सेवा को कॉल करें। नियंत्रक (या सेवा परत के ऊपर कहीं भी) में रहने वाले किसी भी लॉगिन से संबंधित तर्क को नीचे ले जाना चाहिए 'और आपके सर्वलेट द्वारा उपयोग किया जाता है।

public interface LoginService { 
    // this will be called from the login page 
    public void login(String username, String hashedPass); 

    // this will only be visible to other services 
    // you can secure it with AOP and Spring security's method security 
    public void login(String username); 
} 

तो फिर आप अपने सर्वलेट से loginService.login(username); कॉल कर सकते हैं:

सेवा कुछ की तरह लग सकता है।

या अपने सटीक स्थिति में पासवर्ड के बिना अपने टोकन पारित:

loginService.login(new UsernamePasswordAuthenticationToken(u.getUsername(), "")); 
+0

नकारात्मक स्कोर क्यों? – Simeon

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