我有一种SDK /工具包(其中一个模块通过使用spring安全性来处理安全性)。使用此工具包的所有应用程序都在代理服务器后面,该代理服务器终止SSL并将仅HTTP请求转发到应用程序服务器。
该工具包使用Spring security的CookieCsrfTokenRepository
创建可以正常工作的XSRF-TOKEN,但是该cookie并未标记为 secure 。原因是令牌存储库依靠HttpServletRequest.isSecure()
来确定cookie是否应标记为安全。以下是CookieCsrfTokenRepository
的代码段。
public void saveToken(CsrfToken token, HttpServletRequest request, HttpServletResponse response) {
...
Cookie cookie = new Cookie(this.cookieName, tokenValue);
cookie.setSecure(request.isSecure());
}
我发现一个post与我的处境以及他们在本地环境中的工作中提出的解决方案有关。但是,OPS团队不希望更改tomcat的配置,因为要管理的应用程序很多。
我编写了一个过滤器,并将其放置在“ CsrfAuthenticationStrategy”之后,以修改cookie,以在创建cookie后将其明确标记为安全。但是,我只能修改现有的cookie并将其添加为新的cookie。旧的Cookie只能过期,不能删除。
@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 = WebUtils.getCookie(request, TOKEN_NAME);
String token = csrf.getToken();
String path = null;
// invalidate the previous cookie
if (cookie != null) {
path = cookie.getPath();
cookie.setMaxAge(0);
cookie.setValue(null);
response.addCookie(cookie);
}
// create a new cookie with the same name, path and token value
if (token != null) {
Cookie newCookie = new Cookie(TOKEN_NAME, token);
newCookie.setPath(path == null ? "/" : path);
newCookie.setMaxAge(-1);
newCookie.setSecure(Boolean.TRUE);
response.addCookie(newCookie);
}
}
filterChain.doFilter(request, response);
}
因此,有两个cookie,一个已经过期,另一个像预期的那样。这个解决方案看起来很丑。
有人可以在春季提出替代或干净的解决方案吗?