web-dev-qa-db-ja.com

「X-CSRF-TOKEN」を送信するようにSpringSecurityを構成するにはどうすればよいですか?

問題は、SpringSecurityとAngularの間でCSRFトークンを機能させることです。

AngularのSpring Security CSRFトークンインターセプター は仕事をする必要があるようですが、サーバーからのHEAD応答には 'X-CSRF-TOKEN'がありません。

私の現在の小さな実装は GitHub (Tag v.1.0)そして、トピックを知っている誰かがコードをざっと見れば、問題は簡単に見つけられるはずです。

ドキュメントによると、CSRFは自動的に有効にされるべきだったと思いますが、そうではないようです。

私はSpringBootを使用しており、何か別の構成が必要な場合は、XMLよりも注釈ベースの構成を好みます。

Spring SecurityをAngularに対して機能させるための他のアプローチはありますか?

11
masa

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());
11
Dave Syer

元のGitHubリポジトリに隠されたものがあったので、私は自分で質問に答えています: 問題#1

解決策は、CSRFパラメーターをHttpメッセージヘッダーとして追加するJavaコードの数行を追加することでした。

GitHubに実用的なソリューションを追加しました repo タグv.2.0

2
masa