CORSとSpring Security(Springboot)
2436 ワード
CORSの概念
CORSの問題点は、一つのトランスソース要求が二回に分割され、もう一回OPTTIONSを送信すると、OPTTIONSがまずサービス端末に送信されます.具体的な流れは基準を参照して定義されます.次に述べる問題もこのステップを知る必要があるだけです.
Spring Security
Spring Securityの鍵はFilterであり、条件に合致するすべての要求はDelegating Filter ProxyRegistration Beanによって阻止されますが、実際に呼び出されるFilterはsprigSecurityFilterCharinという名前のFilterCharによってブロックされます.
サービス側にCORSを配置する WebMvcConfigrer Adapterを介して を構成します.カスタムFilter により
この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要求をブロックしない .案二、カスタムCorsFilterは、orderを最高優先度または他に設定し、Spring securityのorderより優先度が高いだけが望ましい.
CORSの問題点は、一つのトランスソース要求が二回に分割され、もう一回OPTTIONSを送信すると、OPTTIONSがまずサービス端末に送信されます.具体的な流れは基準を参照して定義されます.次に述べる問題もこのステップを知る必要があるだけです.
Spring Security
Spring Securityの鍵はFilterであり、条件に合致するすべての要求はDelegating Filter ProxyRegistration Beanによって阻止されますが、実際に呼び出されるFilterはsprigSecurityFilterCharinという名前のFilterCharによってブロックされます.
サービス側にCORSを配置する
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins("*");
}
}
@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つの方法で実現される仕組みは全く違っています.つまり、作用が生じるライフサイクルは違っています.
keycloakシーン
先端はすでにjavascriptのインターフェースを通じて、keycloakからtokenを検証して獲得しました.keycloakは単点登録システムとして、理論的にはtokenを通じて任意のバックエンドサービスを登録して検証することができますが、文書上の説明に従って、springbootとsecurityを正しく配置すると、バックエンドは依然としてtokenの検証を通過できません.ただし、同じIPとポートを前後端で使用する場合は、正常に要求される.
解決プロセス
HttpSecurity#authorizeRequests().antMatchers(HttpMethod.OPTIONS).permitAll()