2016-04-04 8 views
2

Ich versuche, den aktuell angemeldeten Benutzer von meiner Spring Boot + AngularJS-Anwendung zurückgeben, aber SecurityContextHolder.getContext().getAuthentication() gibt null zurück.Spring Security getAuthentication() gibt null zurück

Sicherheits config:

@Configuration 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .inMemoryAuthentication() 
      .withUser("test").password("test").roles("USER", "ADMIN"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .formLogin().and() 
      .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).and() 
      .authorizeRequests() 
      .antMatchers("/index.html", "/login.html", "/").permitAll() 
      .anyRequest().authenticated().and() 
      .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class) 
      .csrf().csrfTokenRepository(csrfTokenRepository()); 
    } 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/bower_components/**"); 
     web.ignoring().antMatchers("/js/**"); 
     web.ignoring().antMatchers("/css/**"); 
     web.ignoring().antMatchers("/api/user"); 
    } 

    private static CsrfTokenRepository csrfTokenRepository() { 
     HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
     repository.setHeaderName("X-XSRF-TOKEN"); 
     return repository; 
    } 
} 

Controller:

@RequestMapping(value="/user", method = RequestMethod.GET) 
@ResponseBody 
public User user() { 
    User user = new User(); 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    if (auth != null) { 
     String name = auth.getName(); 
     user.setUsername(name); 
    } 
    return user; 
} 

Antwort

3

Unter der Annahme, dass die Steuerung Sie ist auf den Kontext /api/user abgebildet zeigen, dann ist der Grund, weil Sie die Zeile web.ignoring().antMatchers("/api/user"); zu Ihrem hinzugefügt haben Sicherheitskonfiguration, was bedeutet, dass alle Anfragen an diesen Controller nicht gesichert sind und somit auch keinen SecurityContext haben. Entfernen Sie diese Zeile, damit Spring Security sie sichert.

Auszug aus dem Javadoc der ignorierend Methode:

Web Security von Spring Security zur Verfügung gestellt (einschließlich dem Security) nicht auf HttpServletRequest dieses Spiel verfügbar sein.

+0

Großartig, vielen Dank. – user3170702