CSRF - meldet sich nur beim ersten Mal an
Wenn ich meine App auf dem Server bereitstelle, kann ich mich zum ersten Mal ohne Probleme anmelden. Aber wenn ich mich auslogge, bekomme ich auf der Logout-Post-Anfrage "403 Forbidden". Dann kann ich mich nicht erfolgreich anmelden, da bei der Anmeldeanforderung der Fehler 403 angezeigt wird. Strg + F5, versuche mich erneut anzumelden und ... es funktioniert, aber nur einmal.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/apps", "/sites", "/users").authenticated()
.and()
.csrf()
.csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
und die CsrfHeaderFilter-Klasse:
public class CsrfHeaderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
response.setHeader("X-CSRF-HEADER", token.getHeaderName());
response.setHeader("X-CSRF-PARAM", token.getParameterName());
response.setHeader("X-XSRF-TOKEN", token.getToken());
if (token != null) {
Cookie cookie = WebUtils.getCookie(request, "X-XSRF-TOKEN");
if (cookie == null || token != null && !token.equals(cookie.getValue())) {
cookie = new Cookie("X-XSRF-TOKEN", token.getToken());
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
und in Angular:
$httpProvider.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';
Meine App wird auf localhost bereitgestellt: 8080 / myApp, wenn es darauf ankommt.