Spring Cloud Netflix Zuul, CSRF и отправка формы
У меня проблемы с защитой Spring Cloud и CSRF. Я защитил свое приложение (шлюз и службу регистрации) с помощью Spring Cloud Security, OAuth2 и т. Д.
Я предоставил доступ каждому (allowAll) к / signup, где шлюз направляется к фактической службе регистрации. Я также предоставил доступ каждому на самом сервере регистрации. Это работает как ожидалось.
Что вызывает у меня головную боль, так это защита CSRF. Шлюз и служба регистрации создают токен CSRF самостоятельно. Токен от шлюза будет отправлен клиенту, а токен от службы регистрации потерян (где-то на шлюзе).
Если я отправляю что-то в службу регистрации, защита CSRF срабатывает и говорит, что токен был нулевым или фактическое значение не соответствует ожидаемому значению, если я пытаюсь повторно использовать значение из шлюза, который доступен в HTTP заголовки.
Я работаю с отключением CSRF в службе регистрации, но это не кажется правильным решением, потому что оно работает только тогда, когда кто-то отправляет токен обратно от клиента, как Angular SPA. Когда я пытаюсь отправить форму (которая отображается в службе регистрации) из браузера, это не удается из-за отсутствующего параметра _csrf. Если я активирую CSRF в службе регистрации и добавлю в форму параметр _csrf, защита шлюза CSRF вступит в действие и скажет, что фактический токен не соответствует ожидаемому, что абсолютно верно, поскольку фактический токен является один от службы регистрации, и ожидаемый токен от шлюза.
Я мог бы отключить CSRF на шлюзе, но это приведет к тому, что мне придется настраивать CSRF для каждого сервиса, который используется клиентом REST или SPA.
Я пробовал ignoreAntMatchers() в конфигурации HttpSecurity.csrf(), где я могу исключить определенные пути, но это мне тоже не помогает. Ожидаемое значение - это нечто совершенно другое. Кажется, новый сеанс создан для запроса POST.
Так есть ли шанс, что я смогу использовать CSRF на шлюзе и в сервисе регистрации с отправкой формы и Zuul одновременно?
0 ответов
У вас должно получиться заставить его работать: я думаю, что CSRF следует отключить в Zuul, и что Zuul должен пересылать исходный токен CSRF из службы.
Вы пытались установить собственные "чувствительные заголовки", чтобы избежать потери токена? Поскольку по умолчанию все заголовки "Cookie" и "Set-Cookie" удаляются, вам необходимо изменить его:
zuul:
routes:
users:
path: /myusers/**
# This is the default value if not set
sensitiveHeaders: Cookie,Set-Cookie,Authorization
url: https://downstream
становится
zuul:
routes:
users:
path: /myusers/**
sensitiveHeaders: Authorization
url: https://downstream