में प्रोग्रामिक रूप से लॉग इन करें हम 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>
इस अनुसार काम करना चाहिए वसंत सुरक्षा दस्तावेज और अन्य ऑनलाइन संसाधनों के लिए। क्या गलत हो सकता है पर कोई विचार?
सुरक्षा कॉन्टेक्स्टहोल्डर डिफ़ॉल्ट होल्डिंग नीति थ्रेडलोकल है। प्रत्येक अनुरोध को नए धागे में संसाधित किया जाता है (वास्तव में थ्रेड पूल के मामले में हर कोई नहीं, लेकिन इससे कोई फर्क नहीं पड़ता) और इसके पास संदर्भ होल्डिंग थ्रेडलोकल की अपनी प्रति है। इसलिए आपका प्रमाणीकरण जो लॉग इन विधि में सेट है, को getProjects विधि में एक्सेस नहीं किया जा सकता है (क्योंकि यह किसी अन्य थ्रेड में है)। आपको अपनी प्रमाणीकरण जानकारी को किसी स्थान पर सहेजना चाहिए (उदाहरण के लिए http सत्र) और जब भी सर्वर पर नया अनुरोध आता है (संभवतः सर्वलेट फ़िल्टर में) –
जांचें http://stackoverflow.com/questions/3923296/user-granted जांचें - प्राधिकरण-हमेशा-भूमिका-अज्ञात – axtavt
मैंने एक्स्टाव द्वारा लिखे गए उत्कृष्ट उत्तर का उपयोग करके इस सटीक कार्यक्षमता को कार्यान्वित किया। –