2014-11-19 3 views
4

Я разрабатываю веб-приложение с использованием AngularJS и Spring (4.1.0.RELEASE) в качестве бэкэнд. В настоящее время все работает отлично. Теперь, когда функциональность выполнена, я хотел бы добавить Spring Security (3.2.5.RELEASE) в проект, как для аутентификации, так и для авторизации всех запросов. Поскольку я использую Angular, все мои взгляды являются статическими и никогда не отображаются сервером. Поэтому типичная настройка Spring Security (с помощью jsp для входа в систему) не будет работать. Я рассмотрел множество примеров, и ни один из них не соответствовал моим потребностям. Я не хочу использовать какие-либо внешние фреймворки, такие как Джерси, чтобы помочь с проверкой подлинности или любыми просмотренными сервером видами, например. JSPs.Добавление Spring Security к существующему Spring AngularJS Application

Когда я включаю Spring Security, мои запросы GET по-прежнему работают нормально, но мои запросы POST, такие как мои запросы на вход, больше не работают и возвращают ошибку 404. Контроллеры правильно сопоставлены, и URL-адреса являются действительными, поэтому я знаю, что он должен иметь какое-то отношение к Spring Security, перехватывая запрос и считая его недействительным. Я не уверен, почему это так, но я думаю, что это может иметь какое-то отношение к запросам, не имеющим правильных заголовков и защите CSRF от Spring. Я не хочу отключать эту защиту. Мой вопрос в том, как я могу определить пользовательский URL-адрес для входа с Spring Security, который будет аутентифицировать мой запрос POST для входа, а затем отправить все заголовки, необходимые для включения будущих, прошедших проверку подлинности запросов?

EDIT: У меня есть URL-адрес для работы. Есть ли способ извлечь токен CSRF из вызова ajax? Мои представления все статичны, и сервер сначала попадает в запрос на вход, поэтому нет jsps и нет способа получить токен csrf с сервера через библиотеки тегов jsp. В первом ответе предполагается, что мы находимся на jsp, что не так. Есть ли способ разрешить защиту CSRF, или мне нужно отключить ее и выполнить мою собственную проверку запроса?

+0

Myself также ищет ответ на свой вопрос. спасибо за размещение здесь! – Asik

+0

Похоже, способ, которым вы звоните в методы Post, может быть неисправен, можете ли вы показать код, с которым работаете? – Aeseir

+0

Методы отлично работали до того, как была добавлена ​​Spring Security, поэтому я знаю, что это не имеет ничего общего с ними. Это как-то связано с Spring Security – holtc

ответ

0

С включенной функцией безопасности Spring вам нужно добавить токен CSRF ко всем запросам POST, PATCH, PUT и DELETE. Это можно отправить в заголовке запроса, и вы сможете использовать запрос GET для получения токена. Заголовок по умолчанию: X-CSRF-TOKEN=<tokenvalue>.

Источник: http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html (. Это старая версия документации, но включает в себя очень соответствующий раздел на Ajax и JSON запросов)

Если вы хотите отключить защиту CSRF для определенного URL, вы будете необходимо написать пользовательский RequestMatcher, который исключает ваш URL входа. В конфигурации XML это будет выглядеть следующим образом:

<csrf request-matcher-ref="myCustomRequestMatcher"/> 

См: http://blogs.sourceallies.com/2014/04/customizing-csrf-protection-in-spring-security/

+0

Спасибо, я знаю, что мне нужно добавить это ко всем почтовым запросам, но мой вопрос касается URL-адреса входа. Клиент не имеет взаимодействия с сервером до входа в систему ajax, поэтому нет способа получить токен csrf. Кроме того, в этой ссылке нет ничего о том, как получить CSRF на странице html, все они используют теги jsp, которые мое приложение не использует и не поддерживает. – holtc

Смежные вопросы