В настоящее время мы пытаемся получить доступ к REST-Endpoint приложения Spring Boot в приложении Angular2, но, несмотря на то, что заголовок авторизации работает в Postman (Authorization/Basic dXNlcjp1c2Vy, для базового тестового пользователя с пользователем пароля), он не работает, когда приложение пытается получить доступ к REST-Endpoint. Спринг-Security настроен так:Angular2, доступ к REST с помощью Basic Auth throws «Ответ на предполетный период имеет неверный код статуса HTTP 401»
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder builder) throws Exception {
builder.inMemoryAuthentication().withUser("user").password("user").roles("USER").and().withUser("admin")
.password("admin").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().fullyAuthenticated();
http.httpBasic();
http.csrf().disable();
}
}
Угловая приложение запрашивает учетные данные, прежде чем сделать первый запрос, например, так:
loginTest() {
let headers: Headers = new Headers({'Content-Type': 'application/json', 'Accept': 'application/json'});
headers.append('Authorization', 'Basic ' + window.btoa(this._username + ':' + this._password));
console.log(headers);
return this.http.get('http://localhost:8080/', {headers: headers})
.map((res:any) => res.json);
}
С локального хоста: 8080 является Весенняя загрузка. Мы уже пытались добавить тег Content-политика, потому что были аналогичные проблемы с более ранним проектом, как так:
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' 'unsafe-eval' 'self';
connect-src 'self' http://localhost:3000/ http://localhost:8080/ ws://localhost:3000/; img-src 'self' data:;
style-src 'unsafe-inline' 'self'; font-src 'self'"/>
, но это не сработало. Ошибка мы получаем:
XMLHttpRequest cannot load http://localhost:8080/. Response for preflight has invalid HTTP status code 401
При поиске по запросу через Chrome, это ответ:
HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Set-Cookie: JSESSIONID=4659A74A950FE6C99948D8F4CB245E27; Path=/; HttpOnly
WWW-Authenticate: Basic realm="Realm"
Access-Control-Allow-Origin: http://localhost:3000
Vary: Origin
Access-Control-Allow-Methods: GET
Access-Control-Allow-Headers: accept, authorization, content-type
Access-Control-Allow-Credentials: true
Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
Content-Length: 0
Date: Mon, 04 Jul 2016 07:54:30 GMT
Я не вижу, что Angular2-App делает отличается по сравнению с Почтальон Вот.
Благодаря четыре вашей помощи, это был правильный указатель.Мы не могли установить withCredentials для работы с http, но мы смогли отключить проверку авторизации для OPTIONS-запросов, которая решает проблему (давая нам другое сообщение об ошибке, но это не относится к этому биту =)) –