web-dev-qa-db-ja.com

OPTIONS HttpメソッドのSpring Securityを無効にする

HTTPメソッドの種類に対してSpring Securityを無効にすることはできますか?

Httpリクエストのヘッダーに認証トークンを添付する必要があるサービスを備えたSpring RESTアプリケーションがあります。 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要求を送信すると、サーバーはAuthorization Failedトークンで応答します。明らかにOPTIONSリクエストには認証トークンがありません。 OPTIONSにSpring Security構成からセキュリティレイヤーをエスケープさせることは可能ですか?

65

これを試しましたか

複数の要素を使用して、異なる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パターンと必要なメソッドを選択する必要があることを意味します

11
Koitoer

注釈ベースのセキュリティ構成ファイル(@EnableWebSecurity@Configuration)を使用している場合、configure()メソッドで次のようなことを実行して、OPTION要求を許可できます。特定のパスに対して認証なしでSpring 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();
}
130
Felby

コンテキスト内のすべてのオプションを許可します。

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

誰かが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

3