2016-06-28 4 views
0

Ich bin brandneu im Frühling und ich versuche herauszufinden, wie man einen Benutzer authentifizieren.Spring Security mit JSON funktioniert nicht

Derzeit scheint alles korrekt eingerichtet zu sein. Wenn ich x-www-form-urlencoded verwende, kann ich mich erfolgreich anmelden. Bei Verwendung von application/json erhält meine Anwendung den emailAddress Parameter nicht.

Ich habe SO gegoogelt und überprüft, aber ich kann nichts finden.

Hier ist meine SecurityConfig.

package com.myapp.config; 

import com.myapp.security.RestAuthenticationEntryPoint; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.authentication.dao.DaoAuthenticationProvider; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 
import org.springframework.security.crypto.password.PasswordEncoder; 
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; 
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; 
import org.springframework.web.bind.annotation.RestController; 

@EnableWebSecurity 
@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Autowired 
    @Qualifier("customUserDetailsService") 
    private UserDetailsService userDetailsService; 

    @Autowired 
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint; 

    @Autowired 
    public void configure(AuthenticationManagerBuilder builder) throws Exception { 
     builder.userDetailsService(userDetailsService); 
     builder.authenticationProvider(this.authenticationProvider()); 
    } 

    @Bean 
    public PasswordEncoder passwordEncoder() { 
     return new BCryptPasswordEncoder(); 
    } 

    public DaoAuthenticationProvider authenticationProvider() { 
     DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider(); 
     authenticationProvider.setUserDetailsService(userDetailsService); 
     authenticationProvider.setPasswordEncoder(passwordEncoder()); 

     return authenticationProvider; 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     super.configure(http); 

     http.csrf().disable() 
      .exceptionHandling() 
      .authenticationEntryPoint(restAuthenticationEntryPoint) 
      .and() 
      .authorizeRequests() 
      .antMatchers("/").authenticated() 
      .and() 
      .formLogin().loginPage("/login").usernameParameter("emailAddress").passwordParameter("password") 
      .successHandler(new SimpleUrlAuthenticationSuccessHandler()) 
      .failureHandler(new SimpleUrlAuthenticationFailureHandler()) 
      .and() 
      .logout(); 
    } 
} 
+0

Wie senden Sie Ihre Anmeldeinformationen, wenn Sie 'application/json' verwenden? Wie lautet der Code für das Anmeldeformular? – Setu

+0

Ich benutze einfach Postbote. Ich bekomme eine 200 OK bei der Verwendung von urlencoded, 401 bei der Verwendung von JSON. – iLikeBreakfast

+0

Ja, aber was ist der Code? Codieren Sie die Formulardaten bei Verwendung von 'application/json' in eine gültige json-Zeichenfolge? – Setu

Antwort

1
formLogin().loginPage("/login").usernameParameter("emailAddress").passwordParameter("password") 
       .successHandler(new SimpleUrlAuthenticationSuccessHandler()) 
       .failureHandler(new SimpleUrlAuthenticationFailureHandler()) 

In der oben configure wird ein Standard UsernamePasswordAuthenticationFilter verwendet Parameter zu erhalten Benutzername und Passwort aus Anfrage. Der Standardfilter parst jedoch keine Parameter aus Ihrer JSON-Zeichenfolge in der Anforderung.

Sie können versuchen, eine benutzerdefinierte UsernamePasswordAuthenticationFilter zu erstellen, um den Benutzernamen und das Passwort aus Ihrer json-Zeichenfolge abzurufen und Ihren benutzerdefinierten Filter in der Konfiguration anzuwenden. Im Gegensatz zur XML-Konfiguration, die <custom-filter position="FORM_LOGIN_FILTER" ref="yourCustomFilter" /> verwenden kann, können Sie den Formularanmeldefilter jedoch nicht durch Java Config mit Ihrem benutzerdefinierten Filter ersetzen.

Als Abhilfe können Sie versuchen, mit folgt:

  1. Erstellen Sie einen benutzerdefinierten Filter erweitert AbstractAuthenticationProcessingFilter den Benutzernamen und das Passwort von JSON-String zu erhalten, und die analysierten Parameter in die Anfrage gestellt. Die Lösung besteht darin, die Klasse HttpRequestWrapper zu verwenden, mit der Sie eine Anforderung mit einer anderen umbrechen können. Sie können das von der Unterklasse ableiten und die getParameter überschreiben, um den Benutzernamen und das Passwort zurückzugeben, die von json string analysiert werden. Sie können die umbrochene Anfrage dann an chain.doFilter übergeben.
  2. den benutzerdefinierten Filter vor dem Standard UsernamePasswordAuthenticationFilter mit HttpSecurity#addFilterBefore(yourCustomFilter, UsernamePasswordAuthenticationFilter.class)

Als Benutzername und Passwort hinzufügen von JSON-String an den Anforderungsparameter analysiert wird, soll der Standard UsernamePasswordAuthenticationFilter der Lage sein, die Authentifizierung durchzuführen.