AngularJS SpringBoot без аутентификации csrf защита - PullRequest
0 голосов
/ 07 июня 2018

Моя система использует AngularJS 1.6 и Spring Boot2.0.Мой интерфейс - это простая форма, которую клиенты могут использовать для покупки билетов на мероприятие.Когда страница загружается, она получает данные о текущем активном событии, а затем пользователи могут заполнить форму для отправки.Нет входа / регистрации, так что это как форма Google.Я построил их как отдельные проекты, поэтому они будут работать в разных портах.Теперь я хочу включить защиту csrf, но не могу заставить ее работать.

Я пытался следовать этому руководству, но без аутентификации: https://spring.io/blog/2015/01/12/the-login-page-angular-js-and-spring-security-part-ii. Когда я это сделал, я столкнулся с "Заголовок CORS «Access-Control-Allow-Origin» отсутствует »в части сведений о событии GET, поэтому я добавил фильтр CORS:

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
chain.doFilter(request, response);

После добавления этого мой GET работает, но я сталкиваюсь с той же ошибкой CORS, когдаЯ размещаю детали клиента.Я уже вижу XSRF-TOKEN в cookie, когда использую почтальон, но каким-то образом мой бэкэнд блокирует входящий POST.Насколько я понимаю, angular автоматически использует полученный токен XSRF, поэтому я не изменил ничего во внешнем интерфейсе при реализации Spring безопасности.

Я также пробовал этот: https://sdqali.in/blog/2016/07/20/csrf-protection-with-spring-security-and-angular-js/. И точно так жерезультат, если я просто следую учебному пособию, ошибка CORS в GET, а затем, когда я добавляю простой фильтр CORS, ошибка CORS в POST.Кажется, мои фильтры перепутаны во время выполнения.

Я попытался поиграть с кодами в этих уроках вместе с некоторыми ответами на связанные вопросы здесь, в стеке, но все они не должны иметь дело с проблемой CORS.

1 Ответ

0 голосов
/ 04 июля 2018

Для начала вы должны проверить мой комментарий о том, как включить CORS с пружинной загрузкой и защитой пружин.

Что касается защиты CSRF, то пружинная загрузка 2 с пружинной защитой включит эту функцию напрямую.Тем не менее, чтобы использовать его с AngularJS, вам нужно следовать этому руководству: https://docs.spring.io/spring-security/site/docs/current/reference/html5/#csrf-cookie

Мы также работаем над проектом с внешним интерфейсом AngularJS 1.6 и внутренним подпружиненным загрузчиком 2, но, как мы и не делали,Развернув наш интерфейс и наш сервер по одному и тому же URL, мы столкнулись с проблемой.

Пример:

Файл cookie, сгенерированный сервером, был установлен в домене https://project.company.com с контекстом /backend, который невозможно было прочитать из нашего веб-приложения AngularJS.

Чтобы исправить это, мы принудительно заставили наш серверотправить cookie с контекстом /, чтобы его можно было прочитать из обоих приложений.

@Configuration
@EnableWebSecurity
public class LdapAuthenticationSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        final CookieCsrfTokenRepository csrfTokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();
        csrfTokenRepository.setCookiePath("/"); // Make sure that the cookie can be read from the backend and the frontend on the same domain.
        http.csrf().csrfTokenRepository(csrfTokenRepository);
        http.cors();
    }
}

В случае, если ваши приложения развернуты в разных доменах, но с одной и той же базой, как это:

Я бы предложил принудительно отправлять куки с сервера с доменом, подобным .company.com.Но для этого вам нужно изменить способ Spring-Security управлять созданием файлов cookie.

...