2012-05-30 21 views
8

में प्रोग्रामिक रूप से लॉग इन करें हम jQuery मोबाइल के साथ एक मोबाइल ऐप विकसित कर रहे हैं और वसंत सुरक्षा के साथ सही ढंग से स्थापित वसंत 3.1.x बैकएंड पर उपयोगकर्ता को प्रोग्रामिक रूप से प्रमाणीकृत करना चाहते हैं।वसंत सुरक्षा:

बैकएंड (jQuery के $। पोस्ट का उपयोग करके) में एक POST अनुरोध भेजा गया है जिसमें उपयोगकर्ता नाम और पासवर्ड होता है, तो सर्वर सत्यापित करता है कि क्या क्रेडेंशियल सही हैं और उपयोगकर्ता में लॉग इन करते हैं।

सर्वर सुरक्षा कॉन्टेक्स्ट में प्रमाणीकरण को सही ढंग से सेट करने लगता है, हालांकि जब हम सर्वर के लिए दूसरा अनुरोध करते हैं (एक पृष्ठ पर लॉग इन करने के लिए एक पृष्ठ पर लॉग इन करें) सुरक्षा विवरण याद नहीं किया जाता है और अनाम टोकन संदर्भ में प्रतीत होता है।

इस नियंत्रक प्रणाली, जिसमें प्रवेश (पासवर्ड चेक संक्षिप्तता के लिए निकाला गया) संभालती है:

@RequestMapping(value = "/login", method = RequestMethod.POST, produces = "application/json") 
@ResponseBody 
public Map<String, String> login(@RequestParam String username, @RequestParam String password, HttpServletRequest request) { 
    Map<String, String> response = new HashMap<String, String>(); 

    User u = userService.findByAccountName(username); 

    if (u != null && u.hasRole("inspector")) { 
     UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password); 
     try { 
      Authentication auth = authenticationManager.authenticate(token); 
      SecurityContextHolder.getContext().setAuthentication(auth); 

      response.put("status", "true"); 
      return response; 
     } catch (BadCredentialsException ex) { 
      response.put("status", "false"); 
      response.put("error", "Bad credentials"); 
      return response; 
     } 
    } else { 
     response.put("status", "false"); 
     response.put("error", "Invalid role"); 
     return response; 
    } 
} 

यह अन्य विधि है जिसमें हम संदर्भ से बाहर userdetails मिलता है:

@RequestMapping(value = "/project", method = RequestMethod.GET) 
@ResponseBody 
public String getProjects(HttpSession session) { 

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
    User u = userService.findByAccountName(((UserDetails) authentication.getPrincipal()).getUsername()); 
... 

स्प्रिंग सुरक्षा विन्यास:

<global-method-security pre-post-annotations="enabled"/> 
<http use-expressions="true" auto-config="true"> 

    <form-login login-processing-url="/static/j_spring_security_check" login-page="/" 
       authentication-failure-url="/?login_error=t"/> 

    ... 
    <intercept-url pattern="/api/**" access="permitAll"/> 
    ... 
    <remember-me key="biKey" token-validity-seconds="2419200"/> 
    <logout logout-url="/logout"/> 
</http> 

<authentication-manager alias="authenticationManager"> 
    <authentication-provider user-service-ref="udm"> 
     <password-encoder hash="md5"/> 
    </authentication-provider> 
</authentication-manager> 

इस अनुसार काम करना चाहिए वसंत सुरक्षा दस्तावेज और अन्य ऑनलाइन संसाधनों के लिए। क्या गलत हो सकता है पर कोई विचार?

+0

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

+1

जांचें http://stackoverflow.com/questions/3923296/user-granted जांचें - प्राधिकरण-हमेशा-भूमिका-अज्ञात – axtavt

+0

मैंने एक्स्टाव द्वारा लिखे गए उत्कृष्ट उत्तर का उपयोग करके इस सटीक कार्यक्षमता को कार्यान्वित किया। –

उत्तर

11

मैं आपकी कॉन्फ़िगरेशन से उलझन में हूं। आपने अपना लॉगिन नियंत्रक लागू किया है, लेकिन आप स्प्रिंग सिक्योरिटी के फॉर्म-लॉगिन का उपयोग कर रहे हैं। मैंने हाल ही में वसंत सुरक्षा + jquery के साथ AJAX लॉगिन लागू किया है। अपने स्वयं के नियंत्रक को लिखने के बजाय, मैंने बस अपने स्वयं के प्रमाणीकरण SuccessHandler और प्रमाणीकरण विफलता हैडलर को जसन प्रतिक्रियाओं को वापस करने के लिए लागू किया। बस का विस्तार SimpleUrlAuthenticationSuccessHandler और SimpleUrlAuthenticationFailureHandler अधिभावी के रूप में सरल प्रत्येक वर्ग, कुछ में onAuthenticationSuccess और onAuthenticationFailure तरीकों ....

public void onAuthenticationSuccess(HttpServletRequest request, 
     HttpServletResponse response, Authentication authentication) 
     throws IOException, ServletException { 
    response.getWriter().println("{\"success\": true}"); 
} 

public void onAuthenticationFailure(HttpServletRequest request, 
     HttpServletResponse response, AuthenticationException exception) 
     throws IOException, ServletException { 
    response.getWriter().println("{\"success\": false}"); 
} 

तो फिर तुम कुछ की तरह साथ फार्म लॉगिन तत्व कॉन्फ़िगर कर सकते हैं ...

<form-login login-processing-url="/static/j_spring_security_check" login-page="/" 
      authentication-success-handler-ref="ajaxAuthenticationSuccessHandler" 
      authentication-failure-handler-ref="ajaxAuthenticationFailureHandler" 
      authentication-failure-url="/?login_error=t"/> 
+0

यह पूरी तरह से काम किया ... धन्यवाद। – HDave

+0

खुशी हुई यह मदद मिली, कृपया मेरा उत्तर स्वीकृत – hyness

+0

के रूप में चिह्नित करें यदि मैं कर सकता था .... – HDave

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