2017-07-03 4 views
1

Im Frühjahr Sicherheit, können wir die Ausnahme für schlechte Anmeldeinformationen erhalten, wenn der Benutzername/das Passwort nicht korrekt sind.Frühling Sicherheit schlechte Anmeldeinformationen unterscheiden zwischen ungültigen Benutzernamen oder Passwort

Von DOC: Spring Framework Authentication

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

Gibt es eine Ausnahmeklasse oder Art und Weise zwischen Benutzername ungültig oder Passwort ungültig zu unterscheiden?

Etwas wie folgt aus:

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

UPDATE:

public class SampleDaoAuthenticationProvider extends DaoAuthenticationProvider { 

     @Override 
     protected void additionalAuthenticationChecks(UserDetails 
userDetails, UsernamePasswordAuthenticationToken authentication) 
       throws AuthenticationException { 
       setHideUserNotFoundExceptions(false); 
       super.additionalAuthenticationChecks(userDetails, authentication); 
     } 
    } 
+0

Ich würde stattdessen den Anruf zu setHideUserNotFoundException im Konstruktor tun. – JEY

+0

Welcher Konstruktor? Ich kann hier nur leere Methoden sehen. Sie sagen, ich benutze den Konstruktor SampleDaoAuthenticationProvider, um es zu initialisieren. –

+0

Eine öffentliche hinzufügen SampleDaoAuthenticationProvider() {super(); setHideUserNotFoundException (false);} – JEY

Antwort

0

Achtung: es ist nicht gut Sicherheit der Praxis zu tun. Aber wenn Sie wirklich nicht verbergen möchten UsernameNotFoundException können Sie die AuthenticationProvider konfigurieren (wenn es von AbstractUserDetailsAuthenticationProvider erstreckt), um es anstelle einer BadCredentialException mit setHideUserNotFoundExceptions zu werfen.

JavaDoc Extract:

standardmäßig die AbstractUserDetailsAuthenticationProvider wirft ein BadCredentialsException wenn ein username wird nicht gefunden oder die password ist falsch. Wenn Sie diese Eigenschaft auf false setzen, wird statt dessen UsernameNotFoundException s für die erstere ausgelöst. Beachten Sie, dass dies weniger sicher ist als das Werfen von BadCredentialsException für beide Ausnahmen.

Beispiel:

@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; 
    } 
+0

Ich habe eine Klasse, die DaoAuthenticationProvider erweitert und diese Klasse überschreibt die additionalAuthenticationChecks() -Methode von Spring. Ich kann von dort auf setHideUserNotFoundExceptions zugreifen. Ich glaube also, dass ich diese Setter-Methode in dieser Klasse selbst verwenden kann. –

Verwandte Themen