为OPTIONS Http方法禁用Spring Security


73

是否可以为某种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逃脱安全层吗?

Answers:


10

你试过这个吗

您可以使用多个元素为不同的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模式以及所需的方法


但是我想我们不能有这样的事情 <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST, OPTIONS" />。对 ?
Dhanush Gopinath


在@PreAuthorize批注的情况下,这将如何工作,我希望Put方法具有管理员访问权限,而Post方法具有用户访问权限
Dipanshu Verma

在Java配置中等效吗
Ravi Kumar


137

如果您使用的是基于注释的安全性配置文件(@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();
}

3
+1正是我们为启用CORS OPTIONS请求所做的事情。
睡鼠

它工作正常谢谢您的提示,我正在搜索和调试很多东西,但现在
无法解决,

我在研究类似的问题时发现了您的答案,而该问题目前尚无法解决您的问题。你愿意看看吗?这是链接: stackoverflow.com/questions/36705874/…–
CodeMed

这对于一般的理解可以帮助:docs.spring.io/spring-security/site/docs/4.1.3.RELEASE/...
Dr4gon

我自己不是Java Spring用户,我在后端使用不同的语言遇到了同样的问题。Java / Spring是否在安全性方面带来了任何其他抽象,还是对于所有OPTIONS请求都忽略身份验证中间件方法是最安全的?
Kunok

48

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

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

3
这似乎是允许OPTIONS请求而无需人工干预的唯一方法。
jaseeey '16

如果随后创建要保护的Options终结点,则会忘记配置中的排除项,每个人都可以访问它。您应该考虑使用过滤器,以将cors选项请求从spring-security中排除:docs.spring.io/spring-security/site/docs/4.2.x/reference/html/…–
Tim

1
使用HttpSecurity的是http.authorizeRequests().antMatchers(HttpMethod.OPTIONS,“ / registrybrain / **”)。permitAll()
Ena

花了2多个小时尝试并找到解决方案-仅此方法有效。
Waqas

1
“如果您随后创建要保护的Option端点”,@ Tim为什么会有人需要它?
Maksim Gumerov,

3

如果有人正在寻找使用Spring Boot的简单解决方案。只需添加一个额外的bean:

   @Bean
   public IgnoredRequestCustomizer optionsIgnoredRequestsCustomizer() {
      return configurer -> {
         List<RequestMatcher> matchers = new ArrayList<>();
         matchers.add(new AntPathRequestMatcher("/**", "OPTIONS"));
         configurer.requestMatchers(new OrRequestMatcher(matchers));
      };
   }

请注意,根据您的应用程序的不同,可能会打开它进行潜在的利用。

为更好的解决方案而打开的问题:https : //github.com/spring-projects/spring-security/issues/4448


IgnoredRequestCustomizer自春季引导2起已弃用
。– bvdb

0

如果您使用的是基于注释的安全性配置,则应CorsFilter通过调用.cors()配置将spring添加到应用程序上下文中,如下所示:

@Override
protected void configure(HttpSecurity http) throws Exception
{
     http
    .csrf().disable()
    .authorizeRequests()
      .antMatchers("/resources/**").permitAll()
      .anyRequest().authenticated()
    .and()
    .formLogin()
    .and()
    .httpBasic()
    .and()
    .cors();
}

-1

在某些情况下,必要时添加configuration.setAllowedHeaders(Arrays.asList("Content-Type"));corsConfigurationSource()用时WebSecurityConfigurerAdapter解决CORS问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.