web-dev-qa-db-ja.com

Spring Securityの同じサイトのCookie

Spring Securityで Same-site Cookie フラグを設定することは可能ですか?

そうでない場合、それはサポートを追加するためのロードマップにありますか?一部のブラウザ(Chromeなど)ではすでにサポートされています。

10
Tomáš Hála

HttpServletResponseのインスタンスを取得できる場合、Javaの世界ではいつでも自分でCookie値を設定できます。

次に、次のことができます。

response.setHeader("Set-Cookie", "key=value; HttpOnly; SameSite=strict")

春のセキュリティでは、これをフィルターで簡単に行うことができます。以下に例を示します。

public class CustomFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request,  ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletResponse resp = (HttpServletResponse)response;

        resp.setHeader("Set-Cookie", "locale=de; HttpOnly; SameSite=strict");

        chain.doFilter(request, response);
    }
}

このフィルターを次のようにSecurityConfigに追加します。

http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class)

またはXML経由:

    <http>
        <custom-filter after="BASIC_AUTH_FILTER" ref="myFilter" />
    </http>

<beans:bean id="myFilter" class="org.bla.CustomFilter"/>
1
unwichtich

ここで考えられるすべての解決策は失敗しました。フィルターまたはインターセプターを試すたびに、Set-Cookieヘッダーがまだ追加されていませんでした。この作業を行うことができた唯一の方法は、Spring Sessionを追加し、このBeanを@Configurationファイルの1つに追加することでした。

@Bean
public CookieSerializer cookieSerializer() {
    DefaultCookieSerializer serializer = new DefaultCookieSerializer();
    serializer.setSameSite("none");
    return serializer;
}

とにかく、これが私の同じ状況の他の誰かを助けることを願っています。

0
ice1080

フィルターの代わりに、認証成功ハンドラーでこのように言及できます。


    @Override
        public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
                Authentication authentication) throws IOException {
            response.setStatus(HttpServletResponse.SC_OK);
            clearAuthenticationAttributes(request);
            addSameSiteCookieAttribute(response);
            handle(request, response);
        }

        private void addSameSiteCookieAttribute(HttpServletResponse response) {
            Collection<String> headers = response.getHeaders(HttpHeaders.SET_COOKIE);
            boolean firstHeader = true;
            for (String header : headers) { // there can be multiple Set-Cookie attributes
                if (firstHeader) {
                    response.setHeader(HttpHeaders.SET_COOKIE, String.format("%s; %s", header, "SameSite=Strict"));
                    firstHeader = false;
                    continue;
                }
                response.addHeader(HttpHeaders.SET_COOKIE, String.format("%s; %s", header, "SameSite=Strict"));
            }
        }

回答の1つに記載されていました。実装した後、リンクが見つかりませんでした。

0
Shiva kumar