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

DOC से: स्प्रिंग फ्रेमवर्क प्रमाणीकरण

java.lang.Object
  java.lang.Throwable
    java.lang.Exception
      java.lang.RuntimeException
        org.springframework.security.core.AuthenticationException
         org.springframework.security.authentication.BadCredentialsException

क्या उपयोगकर्ता नाम अमान्य या पासवर्ड अमान्य के बीच अंतर करने के लिए कोई अपवाद वर्ग या तरीका है?

निम्नलिखित की तरह कुछ:

catch(BadCredentialsException e) {
    if(usernameInvalid) {
        // invalid username
    } else {
        // password invalid
    }
}

अद्यतन करें:

 public class SampleDaoAuthenticationProvider extends DaoAuthenticationProvider {

        @Override
        protected void additionalAuthenticationChecks(UserDetails 
userDetails, UsernamePasswordAuthenticationToken authentication)
                throws AuthenticationException {
                setHideUserNotFoundExceptions(false);
                super.additionalAuthenticationChecks(userDetails, authentication);
        }
    }
3
My God 3 जुलाई 2017, 11:42
मैं इसके बजाय कंस्ट्रक्टर में setHideUserNotFoundException को कॉल करूंगा।
 – 
JEY
3 जुलाई 2017, 12:51
कौन सा कंस्ट्रक्टर? मैं यहाँ केवल शून्य विधियाँ देख सकता हूँ। आप मुझे लगता है कि इसे प्रारंभ करने के लिए कन्स्ट्रक्टर नमूनाडाओ प्रमाणीकरण प्रदाता का उपयोग करने के लिए कह रहे हैं।
 – 
My God
3 जुलाई 2017, 13:01
एक सार्वजनिक नमूनाडाओ प्रमाणीकरण प्रदाता () {सुपर (); जोड़ें setHideUserNotFoundException (झूठा);}
 – 
JEY
3 जुलाई 2017, 13:02
तो अब यदि उपयोगकर्ता नाम गलत है तो मुझे UsernameNotFoundException मिलेगा और यदि पासवर्ड गलत है तो मुझे BadCredentialsException मिलेगा? इस प्रकार दोनों के बीच अंतर करना और मेरी समस्या का समाधान करना।
 – 
My God
3 जुलाई 2017, 13:15

1 उत्तर

सबसे बढ़िया उत्तर

चेतावनी: ऐसा करना अच्छा सुरक्षा अभ्यास नहीं है। लेकिन अगर आप वास्तव में UsernameNotFoundException को छिपाना नहीं चाहते हैं, तो आप AuthenticationProvider (यदि यह AbstractUserDetailsAuthenticationProvider से विस्तारित है) को BadCredentialException के बजाय {setHideUserNotFoundExceptions.

जावाडॉक निकालें:

डिफ़ॉल्ट रूप से AbstractUserDetailsAuthenticationProvider एक BadCredentialsException फेंकता है यदि कोई username नहीं मिलता है या password गलत है। इस गुण को false पर सेट करने से UsernameNotFoundException को पूर्व के बजाय फेंक दिया जाएगा। ध्यान दें कि इसे दोनों अपवादों के लिए BadCredentialsException फेंकने से कम सुरक्षित माना जाता है।

उदाहरण:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Autowired
    public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(daoAuthenticationProvider())
    }

    @Bean
    public AuthenticationProvider daoAuthenticationProvider() {
        DaoAuthenticationProvider impl = new DaoAuthenticationProvider();
        impl.setUserDetailsService(yourUserDetailsService());
        impl.setPasswordEncoder(new BCryptPasswordEncoder());
        impl.setHideUserNotFoundExceptions(false) ;
        return impl;
    }
5
JEY 3 जुलाई 2017, 12:40
1
मेरे पास एक वर्ग है जो DaoAuthenticationProvider को बढ़ाता है और वह वर्ग स्प्रिंग की अतिरिक्त प्रमाणीकरण चेक() विधि को ओवरराइड करता है। मैं वहां से setHideUserNotFoundExceptions तक पहुंच सकता हूं। इसलिए मेरा मानना ​​है कि मैं उस सेटर मेथड को उस क्लास में ही इस्तेमाल कर सकता हूं।
 – 
My God
3 जुलाई 2017, 12:46