2013-01-13 13 views
13

मैंने वसंत सुरक्षा का उपयोग कर परिवर्तन पासवर्ड कार्यक्षमता लागू की है लेकिन ((UserDetails) प्रिंसिपल) .getPassword()) उपयोगकर्ता में लॉग इन के लिए शून्य लौट रहा है।उपयोगकर्ता विवरण प्राप्त करें वसंत सुरक्षा 3.1 में खोपड़ी वापस आती है। वर्तमान में लॉग इन उपयोगकर्ता का पासवर्ड कैसे प्राप्त करें?

अगर मुझे सही याद है, तो यह 3.0 में पहले काम करता था। क्या यह 3.1 में बदला गया था ताकि लॉग इन उपयोगकर्ता का वर्तमान पासवर्ड पुनर्प्राप्त नहीं किया जा सके?

नीचे दिए गए कोड में मैं वेब पेज से उपयोगकर्ता पासवर्ड में टाइप किए गए वर्तमान पासवर्ड की जांच कर रहा हूं। मैं तब जांच कर रहा हूं कि लॉग इन उपयोगकर्ता का पासवर्ड टाइप किए गए पासवर्ड से मेल खाता है या नहीं। अगर ऐसा होता है तो मैं oldPasswordMatchNewPassword = true सेट करना चाहता हूं।

मैं इस कार्यक्षमता को कैसे कार्यान्वित करूं?

@RequestMapping(value = "/account/changePassword.do", method = RequestMethod.POST) 
    public String submitChangePasswordPage(
      @RequestParam("oldpassword") String oldPassword, 
      @RequestParam("password") String newPassword) { 
     Object principal = SecurityContextHolder.getContext() 
       .getAuthentication().getPrincipal(); 
     String username = principal.toString(); 
     if (principal instanceof UserDetails) { 
      username = ((UserDetails) principal).getUsername(); 
      System.out.println("username: " + username); 
      System.out.println("password: " 
        + ((UserDetails) principal).getPassword()); 
      if (((UserDetails) principal).getPassword() != null) { 
       if (((UserDetails) principal).getPassword().equals(oldPassword)) { 
        oldPasswordMatchNewPassword = true; 
       } 
      } 
     } 
    if (oldPasswordMatchNewPassword == true) { 
     logger.info("Old password matches new password. Password will be updated."); 
     changePasswordDao.changePassword(username, newPassword); 
     SecurityContextHolder.clearContext(); 
     return "redirect:home.do"; 
    } else { 
     logger.info("Old password did not match new password. Password will be not be updated."); 
     return null; 
    } 
} 

मैंने कुछ sysout() एस डाल दिया ताकि मैं लौटाए गए मान देख सकूं। ((उपयोगकर्ता विवरण) प्रिंसिपल के लिए) .getUsername() मैं सही लॉग इन उपयोगकर्ता देख सकता हूं। ((उपयोगकर्ता विवरण) प्रिंसिपल) .getPassword() यह शून्य लौट रहा है।

मैं ((UserDetails) प्रिंसिपल कैसे प्राप्त करूं) .getPassword() यह मान?

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

उत्तर

25

मैं कोड के इस खंड के लिए इस्तेमाल किया (मिटा-साख = "false") इसे ठीक करने के। अगर यह एक सुरुचिपूर्ण समाधान है मैं नहीं जानता लेकिन यह मेरी समस्या तय:

<authentication-manager alias="authenticationManager" erase-credentials="false"> 
    <!-- authentication-provider user-service-ref="userService" --> 
    <authentication-provider> 
     <jdbc-user-service data-source-ref="dataSource" /> 
    </authentication-provider> 
</authentication-manager> 
6

हां, यह संस्करण 3.1 में बदल गया है। डिफ़ॉल्ट रूप से एक सफल प्रमाणीकरण के बाद प्रमाण पत्र साफ़ कर दिए जाते हैं। इसे रोकने के लिए ProviderManager पर आप eraseCredentialsAfterAuthentication पर झूठ बोल सकते हैं। जानकारी यहां देखें: http://static.springsource.org/spring-security/site/docs/3.2.x/reference/core-services.html#core-services-erasing-credentials

+0

यह समझ में आता है। तो ऐसा करने के लिए सबसे अच्छा अभ्यास क्या है? मैं eraseCredentialsAfter प्रमाणीकरण को बंद करना नहीं चाहता क्योंकि यह सुरक्षा जोखिम उत्पन्न कर सकता है। क्या आप इसे समझने में मेरी मदद कर सकते हैं? – texasdude11

2

के बाद से पासवर्ड याद में नहीं बनी रहती है के बाद उपयोगकर्ता प्रमाणीकृत किया गया है (आम तौर पर एक अच्छी बात है), तो आप स्पष्ट रूप से करने की आवश्यकता होगी इसका उपयोग करने के लिए इसे पुनः लोड करें।

String name = SecurityContextHolder.getContext().getAuthentication(); 

try { 
    authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(name, oldPassword)); 
    // Update password here with your dao 
} catch (AuthenticationException e) { 
    // Old password was wrong 
} 

कि जिस तरह से आप पासवर्ड एन्कोडिंग रणनीतियों की तरह चीजों के बारे में चिंता करने की जरूरत नहीं है: एक वैकल्पिक और अधिक लचीला रणनीति AuthenticationManager का एक उदाहरण इंजेक्षन और कहा कि सीधे उपयोग करने के लिए है। ध्यान दें कि आपको सादा पाठ में पासवर्ड संग्रहित नहीं करना चाहिए। उन्हें bcrypt or something similar का उपयोग करके धोया जाना चाहिए।