Spring Securityのドキュメント says :
「CSRF保護を使用する場合、通常のユーザーがブラウザで処理できるすべてのリクエストにCSRF保護を使用することをお勧めします。ブラウザ以外のクライアントで使用されるサービスのみを作成する場合は、無効にすることをお勧めしますCSRF保護。」
サードパーティの外部サービスなど、「ブラウザ」クライアントと「非ブラウザ」クライアントの両方でサービスを使用する場合、Spring Securityは特定のタイプのクライアントに対してのみCSRFを無効にする方法を提供しますか?
Spring Security XMLでこれを行う方法があると確信していますが、Java Configを使用しているので、ここに私の解決策があります。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Configuration
@Order(1)
public static class SoapApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/soap/**")
.csrf().disable()
.httpBasic();
}
}
@Configuration
public static class WebApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginProcessingUrl("/authentication")
.usernameParameter("j_username")
.passwordParameter("j_password").permitAll()
.and()
.csrf().disable()
}
}
}
私見、そのようなものはありません箱から出して。あなたの場合、私がやろうとしていることは、たとえば/api
をルートとするURLの階層を持たせ、csrfを免除することです。設定は簡単です。 XML構成では、<http>
を含む通常の<csrf/>
ブロックがあり、それを複製して最初のブロックをそのように変更するだけです
<http pattern="/api/**">
...
<!-- csrf -->
</http>
最初の場合と同様に、csrfを使用せずに/api
hierachyへのリクエストに対してトリガーされ、他のすべてのリクエストはそれを使用します。
アプリケーションの通常の部分では、/api/**
URLを決して使用せず、それらをブラウザー以外の使用に予約します。
次に、コントローラーでそれらを通常のURLと/api
の下のコピーの両方にマップします。
@Controller
@RequestMapping({ "/rootcontrollerurl", "/api/rootcontrollerurl"})
class XController {
@RequestMapping(value = "/request_part_url", ...)
public ModelAndView method() {
...
}
}
(もちろん、rootcontrollerurl
とrequest_part_url
は空白かもしれません...)
ただし、あなたは、csrfで制御されていない要求を許可することによるセキュリティへの影響を分析し、最終的に/api
階層からコントローラーを除外する必要があります。
Appconfig-security.xmlの特定のエンドポイントでCSRF保護を無効にするために使用したものは次のとおりです。次の例のように、パターンの情報を含むノードを追加します。
<http security="none" pattern="/sku/*"/>
<http security="none" pattern="/sku/*/*"/>
<http security="none" pattern="/sku"/>
シンボル「*」を使用したmap allリクエストを最初に使用する場合は、順序が重要であることを覚えておいてください。