禁用选项 Http 方法的弹簧安全性

2022-08-31 12:49:35

是否可以为一种类型的HTTP方法禁用Spring Security?

我们有一个Spring REST应用程序,其中包含要求在http请求的标头中附加授权令牌的服务。我正在为它编写一个JS客户端,并使用JQuery发送GET / POST请求。应用程序已使用此筛选器代码启用了 CORS。

doFilter(....) {

  HttpServletResponse httpResp = (HttpServletResponse) response;
  httpResp.setHeader("Access-Control-Allow-Origin", "*");
  httpResp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
  httpResp.setHeader("Access-Control-Max-Age", "3600");
  Enumeration<String> headersEnum = ((HttpServletRequest) request).getHeaders("Access-Control-Request-Headers");
  StringBuilder headers = new StringBuilder();
  String delim = "";
  while (headersEnum.hasMoreElements()) {
    headers.append(delim).append(headersEnum.nextElement());
    delim = ", ";
  }
  httpResp.setHeader("Access-Control-Allow-Headers", headers.toString());
}

但是,当 JQuery 发送对 CORS 的选项请求时,服务器将使用“授权失败”令牌进行响应。显然,OPTIONS请求缺少授权令牌。那么,是否有可能让 OPTIONS 从 Spring 安全配置中逃离安全层呢?


答案 1

如果您使用的是基于注释的安全配置文件( & ),则可以在方法中执行以下操作,以允许Spring Security允许请求,而无需对给定路径进行身份验证:@EnableWebSecurity@Configurationconfigure()OPTION

@Override
protected void configure(HttpSecurity http) throws Exception
{
     http
    .csrf().disable()
    .authorizeRequests()
      .antMatchers(HttpMethod.OPTIONS,"/path/to/allow").permitAll()//allow CORS option calls
      .antMatchers("/resources/**").permitAll()
      .anyRequest().authenticated()
    .and()
    .formLogin()
    .and()
    .httpBasic();
}

答案 2

允许在上下文中使用所有选项:

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
    }