CORSとSpring Security(Springboot)

2436 ワード

CORSの概念
CORSの問題点は、一つのトランスソース要求が二回に分割され、もう一回OPTTIONSを送信すると、OPTTIONSがまずサービス端末に送信されます.具体的な流れは基準を参照して定義されます.次に述べる問題もこのステップを知る必要があるだけです.
Spring Security
Spring Securityの鍵はFilterであり、条件に合致するすべての要求はDelegating Filter ProxyRegistration Beanによって阻止されますが、実際に呼び出されるFilterはsprigSecurityFilterCharinという名前のFilterCharによってブロックされます.
サービス側にCORSを配置する
  • WebMvcConfigrer Adapterを介して
     public class WebConfig extends WebMvcConfigurerAdapter {
         @Override
         public void addCorsMappings(CorsRegistry registry) {
             registry.addMapping("/**")
                     .allowedHeaders("*")
                     .allowedMethods("*")
                     .allowedOrigins("*");
         }
     }
    
  • を構成します.
  • カスタムFilter
     @Bean
     public FilterRegistrationBean corsFilter() {
         UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
         CorsConfiguration config = new CorsConfiguration();
         config.addAllowedOrigin("*");
         config.setAllowCredentials(true);
         config.addAllowedHeader("*");
         config.addAllowedMethod("*");
         source.registerCorsConfiguration("/**", config);
    
         FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
         bean.setOrder(0);
         return bean;
     }
    
  • により
    この2つの方法で実現される仕組みは全く違っています.つまり、作用が生じるライフサイクルは違っています.
  • 方式の一つで、WebMvcConfigrer Adapterの構成は最終的にRequest MappingHandlerMappingに変換されます.このHandlerは最終的にDispactch Servletに呼び出されます.つまり、一つの構成はServletに呼び出されます.
  • 方式では、構成されたFilterが自動的にTomcatまたは他のウェブコンテナに配置されることが分かりやすい.ServletContect InitiazerBens方法では、spring容器に存在するFilterを自動的に検索して実現し、@OrderまたはOrderに基づいてFilterの並べ替えを判断します.
  • 衝突
    keycloakシーン
    先端はすでにjavascriptのインターフェースを通じて、keycloakからtokenを検証して獲得しました.keycloakは単点登録システムとして、理論的にはtokenを通じて任意のバックエンドサービスを登録して検証することができますが、文書上の説明に従って、springbootとsecurityを正しく配置すると、バックエンドは依然としてtokenの検証を通過できません.ただし、同じIPとポートを前後端で使用する場合は、正常に要求される.
    解決プロセス
  • CORS同源構成.CORSは上のように構成されていますが、要求はそのままです.
  • ブラウザのdebugを開けたら、OPTTIONS要求は直接401に戻り、認証に失敗した.この時、CORSをすでに知っていれば、CORSはどの要求もOPTTIONSと元のものに切り分けられます.
  • 前ステップの表面OPTIONS要求がサービスブロックされて、問題を解決する方法が出てきます.
  • ソリューション
  • 案の一つで、Spring securityポリシーを配置し、OPTIONS要求をブロックしない
      HttpSecurity#authorizeRequests().antMatchers(HttpMethod.OPTIONS).permitAll()
    
  • .
  • 案二、カスタムCorsFilterは、orderを最高優先度または他に設定し、Spring securityのorderより優先度が高いだけが望ましい.