У меня есть некоторые проблемы с защитой Spring Cloud и CSRF. Я защитил свое приложение (шлюз и службу регистрации) с помощью Spring Cloud Security, OAuth2 и т. д.
Я предоставил доступ всем (permitAll) к /signup, где шлюз направляет к фактической службе регистрации. Я также предоставил доступ всем на самом сервере регистрации. Это работает, как и ожидалось.
Что вызывает у меня головную боль, так это защита от CSRF. Шлюз и служба регистрации создают токен CSRF самостоятельно. Токен от шлюза будет отправлен клиенту, а токен от службы регистрации будет потерян (где-то на шлюзе).
Если я отправляю что-то в службу регистрации, срабатывает защита CSRF и сообщает, что токен был нулевым или фактическое значение не соответствует ожидаемому значению, если я пытаюсь повторно использовать значение из шлюза, которое доступно в HTTP. заголовки.
У меня он работает с отключением CSRF в службе регистрации, но это не кажется правильным решением, потому что оно работает только тогда, когда кто-то отправляет токен обратно от клиента, например Angular SPA. Когда я пытаюсь отправить форму (которая отображается в службе регистрации) из браузера, это не удается из-за отсутствия параметра _csrf. Если я активирую CSRF в сервисе регистрации и добавлю в форму параметр _csrf, сработает CSRF-защита шлюза и скажет, что фактический токен не соответствует ожидаемому, что абсолютно правильно, поскольку фактический токен — это один от службы регистрации, а ожидаемый токен — от шлюза.
Я мог бы отключить CSRF на шлюзе, но это приведет к тому, что мне придется настраивать материал CSRF для каждой службы, которая используется клиентом REST или SPA.
Я пробовал ignoreAntMatchers() в конфигурации HttpSecurity.csrf(), где я могу исключить определенные пути, но это мне тоже не помогает. Ожидаемое значение — это нечто совершенно другое. Кажется, для запроса POST создается новый сеанс.
Итак, есть ли шанс, что я смогу использовать CSRF на шлюзе и службу регистрации с отправкой формы и Zuul одновременно?