質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

3129閲覧

【SpringSecurity】CORSエラーが解決できない

katahik

総合スコア79

Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

2クリップ

投稿2023/01/06 12:22

前提

以下のライブラリでWebアプリケーションを開発しています。
フロントエンド側からバックエンド側へリクエストを送った際にCORSエラーとなります。

  • フロントエンド:Vue.js(バージョン:3)
  • バックエンド:SpringBoot(バージョン:2.7.6)
  • 認証:SpringSecurity

実現したいこと

フロントエンド側からバックエンド側へリクエストを送った際に発生する以下のCORSエラーを解決したい。
イメージ説明

Access to XMLHttpRequest at 'http://localhost:8085/users/profile/1' from origin 'http://localhost:8888' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

該当のソースコード

Vue.jsでSpring側へリクエストを送信する処理(Edit.vue)

JavaScript

1 onClickDelete() { 2 const path = 'users/profile/' 3 axios.delete( 4 process.env.VUE_APP_ROOT_API + path + this.$store.state.user_id,{ 5 headers: { 6 "Authorization": "Bearer " + this.$store.state.jwt_token, 7 }, 8 }) 9 .then(response => { 10 }) 11 .catch(error => { 12 console.log(error) 13 }) 14 },

Springで処理を受け取る処理(UsersController.java)

Java

1@RestController 2@RequestMapping("/users/profile") 3public class UsersController { 4 @DeleteMapping("/{user_id}") 5 @ResponseStatus(code = HttpStatus.NO_CONTENT, value = HttpStatus.NO_CONTENT) 6 public void profiledelete(@PathVariable("user_id") Long id) throws Exception { 7 } 8}

SpringSecurity設定ファイル(WebSecurityConfig.java)

Java

1@Profile("production") 2@Configuration 3@EnableWebSecurity 4public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 5 @Autowired 6 private UserRepository userRepository; 7 private final JsonRequestAuthenticationProvider jsonRequestAuthenticationProvider; 8 @Value("${security.secret-key:secret}") 9 private String secretKey = "secret"; 10 11 public WebSecurityConfig(JsonRequestAuthenticationProvider jsonRequestAuthenticationProvider// , 12 ) { 13 this.jsonRequestAuthenticationProvider = jsonRequestAuthenticationProvider; 14 } 15 16 @Override 17 protected void configure(HttpSecurity http) throws Exception { 18 JsonRequestAuthenticationFilter jsonAuthFilter = 19 new JsonRequestAuthenticationFilter(userRepository); 20 jsonAuthFilter.setAuthenticationManager(authenticationManagerBean()); 21 http.cors().configurationSource(request -> new CorsConfiguration().applyPermitDefaultValues()); 22 http.addFilter(jsonAuthFilter); 23 http.authorizeRequests() 24 .anyRequest().authenticated() 25 .and() 26 .exceptionHandling().accessDeniedHandler(accessDeniedHandler()) 27 .and() 28 .csrf(). 29 disable() 30 .addFilterBefore(tokenFilter(), UsernamePasswordAuthenticationFilter.class) 31 .sessionManagement() 32 .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 33 ; 34 }

試したこと

Springで処理を受け取る処理(UsersController.java)に@CrossOriginを付与

行ったこと

Springで処理を受け取る処理(UsersController.java)

Java

1@RestController 2@RequestMapping("/users/profile") 3@CrossOrigin 4public class UsersController { 5 @DeleteMapping("/{user_id}") 6 @ResponseStatus(code = HttpStatus.NO_CONTENT, value = HttpStatus.NO_CONTENT) 7 public void profiledelete(@PathVariable("user_id") Long id) throws Exception { 8 } 9}
結果

変わらずCORSエラーが表示される

補足情報

  • SpringSecurityを導入する前は、Spring側で@CrossOriginを付与すれば、CORSエラーが解決していたような気がします。SpringSecurityでの設定を修正する必要があるのか。
  • 他リクエストでGETメソッドの際は、Spring側とCORSエラーがでることなく成功する。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

以下の通り2つファイルを修正し、接続することができました。

WebSecurityConfig.java

@Profile("production") @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserRepository userRepository; private final JsonRequestAuthenticationProvider jsonRequestAuthenticationProvider; @Value("${security.secret-key:secret}") private String secretKey = "secret"; public WebSecurityConfig(JsonRequestAuthenticationProvider jsonRequestAuthenticationProvider// , ) { this.jsonRequestAuthenticationProvider = jsonRequestAuthenticationProvider; } @Override protected void configure(HttpSecurity http) throws Exception { JsonRequestAuthenticationFilter jsonAuthFilter = new JsonRequestAuthenticationFilter(userRepository); jsonAuthFilter.setAuthenticationManager(authenticationManagerBean()); http.cors().configurationSource(request -> { var cors = new CorsConfiguration(); cors.setAllowedOrigins(List.of("*")); cors.setAllowedMethods(List.of("GET","POST", "PUT", "DELETE", "OPTIONS")); cors.setAllowedHeaders(List.of("*")); return cors; }); http.addFilter(jsonAuthFilter); http.authorizeRequests() .anyRequest().authenticated() .and() .exceptionHandling().accessDeniedHandler(accessDeniedHandler()) .and() .csrf(). disable() .addFilterBefore(tokenFilter(), UsernamePasswordAuthenticationFilter.class) .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) ; }

WebConfiguration.java

@Configuration public class WebConfiguration implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedMethods("*"); } }

投稿2023/01/09 06:56

katahik

総合スコア79

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問