0

我目前正在一个 java 服务器应用程序中工作。使用 spring-boot v2.1.3 并部署在 wildfly v18 上。我尝试强制设置 set-cookie 响应标头的属性“SameSite=None; Secure”。

因此,我尝试创建一个过滤器(SameSiteFilter 类)来在业务逻辑完成后修改响应头。我在 WebSecurityConfigurerAdapter 中配置了这个过滤器。

过滤器配置

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        String loginUrl = highpotsUrl + "?url=" + redirectUrl;
        http
            .addFilterAfter(new SameSiteFilter(), BasicAuthenticationFilter.class)
            .headers().frameOptions().disable().and()
            .authorizeRequests()
            .antMatchers("/css/*").permitAll()
            .antMatchers("/js/*").permitAll()
            .antMatchers("/documents/*").permitAll()
            .antMatchers("/security/login").permitAll()
            .antMatchers("/iframe/show").permitAll()
            .anyRequest().fullyAuthenticated()
            .and()
            .formLogin()
            .loginPage(loginUrl).permitAll()
            .and()
            .logout().logoutSuccessUrl(loginUrl);
    }
}

过滤器本身

@Slf4j
public class SameSiteFilter extends GenericFilterBean {

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

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        log.debug("SameSiteFilter::doFilter called");
        
        addSameSiteAttribute(httpResponse);  // Works more or less
        chain.doFilter(request, response);
        // addSameSiteAttribute(httpResponse);  // Response modification not visible
    }

    private void addSameSiteAttribute(HttpServletResponse response) {
        log.debug("=== addSameSiteAttribute");
        httpLog("before", response);

        Collection<String> headers = response.getHeaders(HttpHeaders.SET_COOKIE);
        // boolean firstHeader = true;
        for (String header : headers) { 
            response.setHeader(HttpHeaders.SET_COOKIE, 
                        String.format("%s; %s", header, "SameSite=None; Secure"));            
        }

        response.addHeader("MeinNameIst", "Hase");

        httpLog("after", response);
    }

示例控制器


@RequestMapping("/iframe")
@Controller
@Slf4j
public class IFrameController {
...
    @GetMapping("/show")
    public ModelAndView show(HttpServletRequest request, HttpServletResponse response, 
            @RequestParam(required = false) String transactionId) 
            throws MessageParseException, SignalIdunaConnectionException {
...
        

据我了解:chain.doFilter(request, response); 做我的控制器通常会做的事情。在我的情况下,例如: IFrameCOntroller::show 被调用。

所以我的想法是调用chain.doFilter,从而设置一个cookie(响应包含带有Set-Cookie键的Header条目)。然后修改可用的标头字段。在我的服务器日志中看起来不错。我可以在响应对象中记录标题。但是修改后的 Response-Headers 似乎并没有真正得到响应。在客户端中,Set-Cookie 标头集中没有 SameSite 属性。

有人可以帮我找到我的思维错误吗?

感谢和亲切的问候哈里 E。

4

0 回答 0