Spring Securityで Same-site Cookie フラグを設定することは可能ですか?
そうでない場合、それはサポートを追加するためのロードマップにありますか?一部のブラウザ(Chromeなど)ではすでにサポートされています。
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"/>
ここで考えられるすべての解決策は失敗しました。フィルターまたはインターセプターを試すたびに、Set-Cookieヘッダーがまだ追加されていませんでした。この作業を行うことができた唯一の方法は、Spring Sessionを追加し、このBeanを@Configurationファイルの1つに追加することでした。
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setSameSite("none");
return serializer;
}
とにかく、これが私の同じ状況の他の誰かを助けることを願っています。
フィルターの代わりに、認証成功ハンドラーでこのように言及できます。
@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つに記載されていました。実装した後、リンクが見つかりませんでした。