#javascript #spring-boot #fetch
#javascript #spring-boot #выборка
Вопрос:
Приложение Spring boot имеет некоторые REST API, которые защищены аутентификацией. Если я войду в систему и получу доступ к API-интерфейсам из браузера, все будет работать нормально. Но если я вызываю API-интерфейсы из вызова JavaScript fetch() из другого источника, он возвращает страницу входа, а не запрошенные данные. Как правило, это происходит, если я получаю доступ к любой странице, защищенной аутентификацией, когда я не входил в систему. Поэтому я предполагаю, что функция JS fetch () не отправляет файлы cookie.
Но добавление credentials: 'include'
заголовков не решает проблему.
Моя конфигурация веб-безопасности —
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) {
try {
http.cors()
.and()
.authorizeRequests()
.antMatchers("/admin", "/api/**", "/admin/**").authenticated()
.antMatchers("/**").permitAll()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.csrf().disable();
} catch (Exception e) {
System.out.println("Exception occured during handling security: " e);
}
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("pass")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("http://127.0.0.1:8090"));
configuration.setAllowedMethods(Arrays.asList("*"));
configuration.setAllowedHeaders(Arrays.asList("*"));
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
И моя команда fetch () —
fetch(url, {
method: 'GET',
credentials: 'include'
}).then(response => {
response.text().then(data => {
console.log(data);
...
Верно ли мое предположение?
Как мне решить эту проблему?
Комментарии:
1. Это не проблема выборки для отправки файлов cookie, я думаю, что сеанс вашего браузера не включает файлы cookie. Когда вы входите в систему, делая запрос POST, в нем также должны быть указаны конкретные учетные данные. Можете ли вы запросить аутентификацию, используя
REST
маршрут, а не логин, а затем нажать наGET
маршрут?2. @AshishYadav Если я правильно понял ваш комментарий, да, я могу это сделать. После выхода из системы я могу нажать на API, и он перенаправит меня на вход в систему. После успешного входа в систему он возвращается с запрошенной информацией в браузере в формате JSON, как и ожидалось. Но через JS fetch() это не работает таким образом.