Я довольно новичок в Spring Framework и уже довольно давно сталкиваюсь с проблемой.
Я хочу получить доступ к своему серверу через HTTP-запросы из приложения Angular, но сервер не принимает предварительный запрос от моего Angular приложения.
Ошибка Msg. в Chrome:
Access to XMLHttpRequest at 'https://localhost:8444/' from origin 'https://localhost:4200' 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.
Вход с сервера:
HTTP OPTIONS "/"
Complete 401 UNAUTHORIZED
или
HTTP OPTIONS "/"
Completed 403 FORBIDDEN
Вот мой сервер настройки:
AuthorizationConfig:
@Bean
fun securityWebFilterChainFn(http: ServerHttpSecurity): SecurityWebFilterChain = http
.authorizeExchange { exchanges ->
val issuePath = "/"
val issueIdPath = "/*"
exchanges
.pathMatchers(POST, issuePath).permitAll()
.pathMatchers(GET, issuePath, issueIdPath).hasRole(admin)
.pathMatchers(PUT, issuePath).hasRole(admin)
.pathMatchers(PATCH, issueIdPath).hasRole(admin)
.pathMatchers(DELETE, issueIdPath).hasRole(admin)
.pathMatchers(OPTIONS).permitAll() // <--- with this line: Status 403, without 401
.matchers(EndpointRequest.to("health")).permitAll()
.matchers(EndpointRequest.toAnyEndpoint()).hasRole(actuator)
.anyExchange().authenticated()
}
.httpBasic {}
.formLogin { form -> form.disable() }
.csrf { csrf -> csrf.disable() }
.build()
endpoints.web.cors:
allowed-origins: https://localhost,https://127.0.0.1,https://localhost:4200,https://127.0.0.1:4200
allowed-methods: GET,POST,PUT,PATCH,DELETE,OPTIONS
allowed-headers: Origin,Content-Type,Accept,Authorization,Access-Control-Allow-Origin,Access-Control-Allow-Methods,Access-Control-Allow-Headers,Access-Control-Expose-Headers,Allow,Content-Length,Date,If-None-Match,If-Match,Last-Modified,If-Modified-Since,Host,User-Agent,Accept,Accept-Encoding,Connection,Sec-Fetch-Dest,User-Agent
exposed-headers: Location,ETag,Access-Control-Allow-Origin,Access-Control-Allow-Headers
также пробовал следующее, с тем же результатом:
endpoints.web.cors:
allowed-origins: '*'
allowed-methods: '*'
allowed-headers: '*'
exposed-headers:
Решение для Эта проблема должна быть легкой, если разрешить предварительную проверку OPTIONS
в моей FilterChain. Я сделал это с .pathMatchers(OPTIONS).permitAll()
, но это только изменяет код состояния с 401 на 403.
Есть что-то, что я пропустил? Поскольку я все еще очень плохо знаком с Spring, я еще не знаю всех возможностей и, возможно, я упустил что-то важное. Любая помощь или совет высоко ценится.
Моя настройка:
Spring Boot 2.3.0.M3
Spring Security 5.3.0.RELEASE
Spring Framework 5.2.5.RELEASE
Kotlin 1.4.0
OpenJDK 14+36-1461