2011-03-24 18 views
7

मैं नीचे लागू करने की कोशिश कर रहा हूं, लेकिन मेरा प्रमाणीकरण प्रबंधक उदाहरण नीचे अपवाद फेंकता है और स्वचालित नहीं है। मैं वसंत से मैन्युअल रूप से इसका उदाहरण कैसे प्राप्त करूं? मैं एक वसंत नियंत्रक का उपयोग नहीं कर रहा हूं, मैं एक जेएसएफ अनुरोध scoped बीन का उपयोग कर रहा हूँ। जब मैं कंटेनर प्रमाणीकरण प्रबंधक को स्वत: करने की कोशिश करता है तो मुझे रनटाइम पर निम्न अपवाद मिलता है। अनुरोध कैश ठीक में आता है। मुझे समझ नहीं आता क्यों मुझे दो उदाहरणों की क्या ज़रूरत है ...प्रमाणीकरण प्रबंधक का उदाहरण प्राप्त करें मैन्युअल

config:

<authentication-manager> 
     <authentication-provider user-service-ref="userManager"> 
       <password-encoder ref="passwordEncoder" /> 
     </authentication-provider> 
    </authentication-manager> 

autowired निर्भरता इंजेक्शन में विफल रहा है; नेस्टेड अपवाद है org.springframework.beans.factory.BeanCreationException: ऑटोवायर फ़ील्ड नहीं कर सका: संरक्षित org.springframework.security.authentication.AuthenticationManager com.dc.web.actions.SignUpDetail.authenticationManager; नेस्टेड अपवाद है org.springframework.beans.factory.No.SuchBeanDefinitionException: प्रकार का कोई अनोखा बीन [org.springframework.security.authentication.AuthenticationManager] परिभाषित किया गया है: अपेक्षित एकल मिलान बीन लेकिन पाया 2: [org.springframework.security.authentication.ProviderManager # 0, org.springframework.security.authenticationManager] javax.faces.webapp.FacesServlet.service (FacesServlet.java:325)

@Controller 
public class SignupController 
{ 

    @Autowired 
    RequestCache requestCache; 

    @Autowired 
    protected AuthenticationManager authenticationManager; 

    @RequestMapping(value = "/account/signup/", method = RequestMethod.POST) 
    public String createNewUser(@ModelAttribute("user") User user, BindingResult result, HttpServletRequest request, HttpServletResponse response) 
    { 
     //After successfully Creating user 
      authenticateUserAndSetSession(user, request); 

     return "redirect:/home/"; 
    } 

    private void authenticateUserAndSetSession(User user, 
     HttpServletRequest request) 
    { 
     UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
       user.getUsername(), user.getPassword()); 

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

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

     SecurityContextHolder.getContext().setAuthentication(authenticatedUser); 
    } 

} 
+0

क्या आप कह रहे हैं कि 'प्रमाणीकरण प्रबंधक' फ़ील्ड शून्य है? क्या 'अनुरोध कैश' ठीक है? – skaffman

+0

@skaffman उत्तर के लिए धन्यवाद, मैंने कुछ और जानकारी के साथ अपने प्रश्नों को थोड़ा सा अद्यतन किया। जो मैंने पहले पोस्ट किया वह सही नहीं था, यह शून्य नहीं है। कंटेनर का कहना है कि मेरे पास प्रमाणीकरण प्रबंधक के दो उदाहरण हैं लेकिन मैं नहीं देखता कि कैसे। मैंने उपरोक्त मेरी कॉन्फ़िगरेशन को भी चिपकाया, कोई विचार? मैं सफल पंजीकरण के बाद बस एक ऑटो लॉगिन करने की कोशिश कर रहा हूँ। क्या मुझे अपने उपयोगकर्ता प्रबंधक को स्वत: लॉगिन करने के लिए उपयोगकर्ता की आवश्यकता है? userManager में कोई विधि नहीं है जो उपयोगकर्ता नाम पासवर्ड लेता है प्रमाणीकरण टोकन – c12

उत्तर

33

पहले, अपने AuthenticationManager

के लिए एक स्पष्ट सेम नाम प्रदान
<authentication-manager alias="authenticationManager"> 
    ... 
</authentication-manager> 

सेकंड, ऑटो-वायरिंग के दौरान क्वालीफायर का उपयोग करें:

@Autowired 
@Qualifier("authenticationManager") 
protected AuthenticationManager authenticationManager; 
+0

यह अजीब है ... यह उपनाम के बिना क्यों काम नहीं करता है? – Xorty

+0

@Xorty कोई उपनाम नहीं है, आपको प्रमाणीकरण प्रबंधक बीन के लिए स्वत: जेनरेट किया गया नाम अनुमान लगाना चाहिए (मुझे यकीन नहीं है कि इसका डिफ़ॉल्ट रूप से नाम है)। सिद्धांत रूप में, यह काम कर सकता है यदि आप प्रकार के आधार पर बाध्यकारी का उपयोग करते हैं, न कि नाम से, हालांकि यह वास्तविक दुनिया प्रणालियों में शायद ही कभी मामला है। –

+0

@BorisKirzner मैं अपने उपयोगकर्ता ऑब्जेक्ट को स्वचालित करने के लिए इसका उपयोग कैसे कर सकता हूं क्योंकि मुझे httprequest पर उपयोगकर्ता को मोबाइल डिवाइस से प्राप्त करने की आवश्यकता है और इसे प्रमाणित करें और सत्र आईडी को टोकन –

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