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構成からセキュリティレイヤーをエスケープさせることは可能ですか?
これを試しましたか
複数の要素を使用して、異なる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パターンと必要なメソッドを選択する必要があることを意味します
注釈ベースのセキュリティ構成ファイル(@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();
}
コンテキスト内のすべてのオプションを許可します。
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
}
誰かが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