Проклятье.Оказывается, проблема была в CSRF, в основном в скрытой документации Angular и вводящих в заблуждение журналах фильтров Spring.
Мне потребовалось около 10 часов, чтобы заставить его работать, но только на производстве (где Angular находится на том же хосте / порту с Spring),Я попытаюсь заставить его работать в dev, но для этого требуется переписать весь модуль, поставляемый Angular, с привязкой к его настройкам по умолчанию.
Теперь о проблеме:
Все начинается с Spring Security.когда мы хотим использовать CSRF (и мы делаем).Очевидно, CsrfFilter
буквально взрывается, если не может соответствовать ожидаемым токенам CSRF, и возвращается к /error
.Все это происходит без ЛЮБОГО конкретного сообщения журнала, но просто Request method 'DELETE' not supported
, которое, как мы знаем, присутствует.
Это относится не только к DELETE
, но и ко всем запросам действий (non-GET/HEAD
).
Это все указывает на «Как настроить CSRF с Angular?».Ну, вот и мы:
И это работает по умолчанию.Основан на механизме Cookie-заголовка для CSRF.
Но подождите, это еще не все!
Spring должен быть настроен для механизма Cookie-заголовка.К счастью, мы получили:
@Override
protected void configure(HttpSecurity http) throws Exception
{
http.csrf().csrfTokenRepository(this.csrfRepo());
}
private CookieCsrfTokenRepository csrfRepo()
{
CookieCsrfTokenRepository repo = new CookieCsrfTokenRepository();
repo.setCookieHttpOnly(false);
return repo;
}
, который встроен весной и на самом деле использует те же имена файлов cookie / заголовков, что и Angular.Но что случилось с repo.setCookieHttpOnly(false);
?Ну ... еще одна плохо документированная вещь.Вам просто нужно установить значение false, иначе сторона Angular не будет работать.
Опять же - это работает только для производственных сборок, потому что Angular не поддерживает внешние ссылки.Больше на: Angular 6 не добавляет заголовок X-XSRF-TOKEN к http-запросу
Так что да ... чтобы он работал в dev localhost с 2 серверами, мне понадобится 1-й длявоссоздать механизм https://angular.io/api/common/http/HttpClientXsrfModule, чтобы также перехватывать запросы не по умолчанию.
РЕДАКТИРОВАТЬ
На основе комментария JB Nizet я подготовил настройку, которая работает как для разработчиков, так и для разработчиков.производство.Действительно, прокси - это круто.Если включены CSRF и SSL (в моем случае), вам также необходимо включить SSL в Angular CLI, иначе Angular не сможет использовать CSRF прокси-сервера с поддержкой SSL и, следовательно, не будет работать.
"serve": {
"options": {
"proxyConfig": "proxy.conf.json",
"sslKey": "localhost.key",
"sslCert": "localhost.crt",
"ssl": true
}
}
Обратите внимание, что Cert и Key будут автоматически сгенерированы, если они не найдены :) Для бэкэнда Spring вам не нужен один и тот же сертификат.Я использую отдельные JKS там.
Ура!
![enter image description here](https://i.stack.imgur.com/6Co1z.png)