通过反向代理后面的Pivotol TC服务器进行春季启动

时间:2018-08-09 15:40:36

标签: java cookies spring-security csrf tcserver

我有一种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,一个已经过期,另一个像预期的那样。这个解决方案看起来很丑。

enter image description here

有人可以在春季提出替代或干净的解决方案吗?

0 个答案:

没有答案