問題は、SpringSecurityとAngularの間でCSRFトークンを機能させることです。
AngularのSpring Security CSRFトークンインターセプター は仕事をする必要があるようですが、サーバーからのHEAD応答には 'X-CSRF-TOKEN'がありません。
私の現在の小さな実装は GitHub (Tag v.1.0
)そして、トピックを知っている誰かがコードをざっと見れば、問題は簡単に見つけられるはずです。
ドキュメントによると、CSRFは自動的に有効にされるべきだったと思いますが、そうではないようです。
私はSpringBootを使用しており、何か別の構成が必要な場合は、XMLよりも注釈ベースの構成を好みます。
Spring SecurityをAngularに対して機能させるための他のアプローチはありますか?
Angularは「XSRF-TOKEN」というCookieを探すので、クライアントにとって最も簡単なのはそれを送信することです。たとえば、Filter
で実行できます(例 https://github.com/spring-guides/tut-spring-security-and-angular-js/blob/master/single /src/main/Java/demo/UiApplication.Java#L65 ):
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
if (csrf != null) {
Cookie cookie = new Cookie("XSRF-TOKEN", csrf.getToken());
cookie.setPath("/");
response.addCookie(cookie);
}
filterChain.doFilter(request, response);
}
};
}
更新:Spring Security 4.2以降、Cookie csrfリポジトリを使用する場合(リンクは依然として最良のソースです)、angularの正しいCookie名がデフォルトで使用されます)、つまり、カスタムフィルター例:
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());