小编典典

OPTIONS Http方法禁用Spring Security

spring

是否可以为某种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请求缺少授权令牌。那么有可能让OPTIONS从Spring Security Configuration逃脱安全层吗?


阅读 1329

收藏
2020-04-13

共2个答案

小编典典

你试过这个了吗

你可以使用多个元素为不同的URL集定义不同的访问要求,但是将按照列出的顺序评估它们,并且将使用第一个匹配项。因此,你必须将最具体的匹配项放在顶部。你还可以添加方法属性以将匹配限制为特定的HTTP方法(GET,POST,PUT等)。

<http auto-config="true">
    <intercept-url pattern="/client/edit" access="isAuthenticated" method="GET" />
    <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST" />
</http>

以上意味着你需要选择要拦截的url模式以及所需的方法

2020-04-13
小编典典

如果你使用的是基于注释的安全性配置文件(@EnableWebSecurity&@Configuration),则可以在该configure()方法中执行类似以下操作,以允许OPTIONSpring Security在不验证给定路径的情况下允许请求:

@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();
}
2020-04-13