2013-08-01 6 views
8

का उपयोग कर स्प्रिंग सिक्योरिटी के साथ उपयोगकर्ता को प्रोग्रामेटिक रूप से प्रमाणीकृत कैसे कर सकता हूं, मैं सोच रहा था कि मैं उपयोगकर्ता को प्रमाणीकृत करने के लिए यहां क्या कर रहा हूं। मेरे पास एक ऐसा एप्लिकेशन है जहां उपयोगकर्ता अपने खाते को सक्रिय करने के लिए कई कदम उठाता है, और ऐसा करने पर मैं लॉगिन फॉर्म को बाईपास करना चाहता हूं और उन्हें सीधे अपने डैशबोर्ड पर ले जाना चाहता हूं।मैं DaoAuthenticationProvider

protected void automatedLogin(String username, String password, HttpServletRequest request) { 

     try { 
      // Must be called from request filtered by Spring Security, otherwise SecurityContextHolder is not updated 
      CustomUserDetailsService udService = new CustomUserDetailsService(userDAO, request); 
      UserDetails uDetails = udService.loadUserByUsername(username); 
      UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(uDetails, password); 
      token.setDetails(new WebAuthenticationDetails(request)); 
      DaoAuthenticationProvider authenticator = new DaoAuthenticationProvider(); 
      Authentication authentication = authenticator.authenticate(token); 
      SecurityContextHolder.getContext().setAuthentication(authentication); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      SecurityContextHolder.getContext().setAuthentication(null); 
     } 

    } 

मैं अपने प्रमाणीकरण प्रदाता के रूप में DaoAuthenticationProvider वर्ग का उपयोग करना चाहिए:

यहाँ की तरह अपने स्वचालित लॉगिन समारोह दिखाई देता है। मैं सत्यापित किया है कि मैं सही साख, आईडी, अधिकार भूमिकाओं, आदि से युक्त एक UserDetails मॉडल हो रही है

जब यह प्रमाणित विधि एक अशक्त सूचक में मैं चलाने के कॉल कहीं DaoAuthenticationProvider कक्षा में रास्ते:

org.springframework.security.authentication.AuthenticationServiceException org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:109) org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider पर पर । प्रमाणित (AbstractUserDetail sAuthenticationProvider.java:132) com.bosch.actions.BaseController.doAutoLogin (BaseController.java:659) पर। । । org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:101)

पर java.lang.NullPointerException मैं, वास्तव में यकीन नहीं क्या रिक्त है कर रहा हूँ के रूप में मैं डॉन ': की वजह से स्रोत कोड उपलब्ध नहीं है।

संपादित मैं यहाँ स्रोत कोड को खोजने के लिए कर रहा था - https://github.com/SpringSource/spring-security/blob/master/core/src/main/java/org/springframework/security/authentication/dao/DaoAuthenticationProvider.java

मैं स्पष्ट रूप से वस्तु पर UserDetailsService की स्थापना करके चारों ओर अशक्त सूचक प्राप्त करने में सक्षम था:

authenticator.setUserDetailsService(udService); 

लेकिन अब मुझे बुरा क्रेडेंशियल अपवाद मिलता है जब मुझे पता है कि प्रदान किया गया पासवर्ड सही है, क्योंकि मैंने इसे कोड में पहले उपयोगकर्ता डिस्प्ले ऑब्जेक्ट में डिबगर में देखा है।

org.springframework.security.authentication.BadCredentialsException: org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks (DaoAuthenticationProvider.java:87) org.springframework.security पर पर बुरा साख। authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate (AbstractUserDetailsAuthenticationProvider.java:149)

+0

स्प्रिंग सुरक्षा खुला स्रोत है, तो आप स्रोत कोड उपलब्ध है। आपको शायद समस्याएं आ रही हैं क्योंकि दाओए प्रमाणीकरणप्रोवाइडर को वसंत प्रबंधित बीन होने के लिए डिज़ाइन किया गया है। – samlewis

उत्तर

9

मैं प्रमाणीकरण piecing द्वारा काम कर एक साथ गुण वसंत सेम परिभाषा और se में परिभाषित के सभी प्राप्त करने में सक्षम था उन्हें DaoAuthenticationProvider ऑब्जेक्ट पर प्रोग्रामेटिक रूप से टिंग करना। ऐसा लगता है कि ऐसा लगता है कि यह एक मूर्ख सवाल हो सकता है, लेकिन मुझे उम्मीद है कि यह किसी की मदद करेगा!

सही कोड:

protected void automatedLogin(String username, String password, HttpServletRequest request) { 

     try { 
      // Must be called from request filtered by Spring Security, otherwise SecurityContextHolder is not updated 
      CustomUserDetailsService udService = new CustomUserDetailsService(userDAO, request); 
      CustomMd5PasswordEncoder passEncoder = new CustomMd5PasswordEncoder(); 
      ReflectionSaltSource saltSource = new ReflectionSaltSource(); 
      saltSource.setUserPropertyToUse("salt"); 
      UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password); 
      token.setDetails(new WebAuthenticationDetails(request)); 
      DaoAuthenticationProvider authenticator = new DaoAuthenticationProvider(); 
      authenticator.setUserDetailsService(udService); 
      authenticator.setPasswordEncoder(passEncoder); 
      authenticator.setSaltSource(saltSource); 
      Authentication authentication = authenticator.authenticate(token); 
      SecurityContextHolder.getContext().setAuthentication(authentication); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      SecurityContextHolder.getContext().setAuthentication(null); 
     } 

    } 
+3

खुशी है कि आपको एक फिक्स मिला, लेकिन ईमानदार होने के लिए, यह नहीं है कि कैसे वसंत सुरक्षा का उपयोग किया जाना था। आप अपने आप पर बहुत सारे काम कर रहे हैं, आपको यह नहीं करना चाहिए। – Akshay

+0

यह ऐप में स्प्रिंग सिक्योरिटी का सामान्य उपयोग नहीं है। यह एक बार का उदाहरण है जहां मुझे बिना किसी फॉर्म में प्रमाण पत्र की आपूर्ति किए बिना उपयोगकर्ता को लॉग इन करने की आवश्यकता है। हर बार वे फॉर्म के माध्यम से लॉग इन करेंगे, और वसंत सुरक्षा बीन काम कर रहे होंगे। यह समझाते हुए कि, यदि आप उत्तर देने वाले व्यक्ति हैं तो मुझे आशा है कि आप अपना दिमाग बदल दें, क्योंकि मुझे लगता है कि यह स्टैक ओवरफ्लो पर मेरी प्रतिष्ठा को गलत तरीके से नुकसान पहुंचाता है। – rawkfist0215

+0

बाकी ने मेरे दोस्त को आश्वासन दिया, मैंने आपको वोट नहीं दिया। मुझे नहीं लगता कि जवाब गलत था, मैं बस सुझाव दे रहा था कि वसंत सुरक्षा इस तरह इस्तेमाल नहीं किया जा रहा था। और पी एस नीचे वोटिंग आप एसओ पर भी मेरी प्रतिष्ठा को कम कर देंगे ... :) – Akshay