2017-08-21 1 views
0

Ich habe die Login-Funktion in meiner Anwendung mit Spring Security verwaltet. Ich mache das mit den zwei Standard-Parametern (Benutzername und Passwort) und es funktioniert richtig. Allerdings muss ich einen zusätzlichen Parameter in der Login-Funktion hinzufügen, aber ich habe Probleme damit.Zusätzliche Parameter in Spring Security Login

In SecurityConfig.java, habe ich den Filter hinzugefügt und es ruft, wenn Senden Schaltfläche gedrückt wird.

public class SecurityConfig erweitert WebSecurityConfigurerAdapter {

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

    http 
    .authorizeRequests() 
    .antMatchers("/","/index","/login","/work", "/css/**","/out/**", "/js/**","/images/**","/fonts/**").permitAll() 
    .anyRequest().authenticated() 
    .and() 
    .formLogin().loginPage("/login").defaultSuccessUrl("/home") 
    .permitAll() 
    .and().logout().permitAll().and() 
    .csrf().disable(); 

    http.addFilterBefore(new ExUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); 

} 

Dann meine eigene Filter. Ich erhalte die neuen Parameter (Firma) Wert richtig:

@Override 
public Authentication attemptAuthentication(HttpServletRequest request, 
              HttpServletResponse response) throws AuthenticationException { 

    String dbValue = request.getParameter("Company"); 
    request.getSession().setAttribute("dbValue", dbValue); 

    return super.attemptAuthentication(request, response); 
} 

Ich habe das Problem, wenn super.attemptAuthentication (request, response); heißt, ich bekomme null Zeiger.

Error: 
    java.lang.NullPointerException org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:93) 
    es.smt.startrekweb.filter.ExUsernamePasswordAuthenticationFilter.attemptAuthentication(ExUsernamePasswordAuthenticationFilter.java:35) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 

Dies ist der Code, wo ich in UsernamePasswordAuthenticationFilter.java

return this.getAuthenticationManager().authenticate(authRequest); 

auch den Null-Zeiger hat, die ich in meinem Debugger die nächsten Informationen

contextBeforeChainExecution = {[email protected]} "[email protected]ffffff: Null authentication" 
authentication = null 

niemanden sehen weiß was ich falsch mache ?? Vielen Dank!!

Antwort

1

Sie haben einen Filter durch den Einsatz neuer hinzugefügt:

new ExUsernamePasswordAuthenticationFilter() 

so es hat nichts autowired. , dass die this.getAuthenticationManager() gibt null zurück.

Wenn Sie lediglich den Anforderungsparameter an ein Attribut übergeben müssen, müssen Sie UsernamePasswordAuthenticationFilter nicht erweitern.

Beachten Sie, dass Sie nur einen Filter hinzufügen und ihn nicht ersetzen.

+0

Danke, ich verstehe den Kommentar über den Filter. Aber wenn ich den Filter nicht erweitere, wie bekomme ich die zusätzlichen Informationen? Da Spring Securty nur den Benutzernamen und das Passwort standardmäßig – Zuri

+1

speichert, können Sie den Filter erweitern, aber statt neue ExUsernamePasswordAuthenticationFilter() zu erstellen, erstellen Sie eine Bean und verwenden Sie sie. – Elyran

+0

Danke! Ich habe getan wie du sagst. Ich habe einen Filter als Bean anstelle eines neuen ExUsernamePasswordAuthenticationFilter() hinzugefügt und es funktioniert! – Zuri