Статьи

Защитите свои приложения AngularJS с помощью Spring Security и Spring Session

Несколько дней назад я были в середине подготовки к моему  Spring One 2GX 2014  разговора  Создания модульного Test-Driven ОРА  (Slideshare) с  весной  и  AngularJS . Часть презентации — это демонстрационное приложение, которое я создал и которое называется  botanic-ng . Это приложение использует AngularJS на стороне клиента и Spring ( Boot ) на стороне сервера. Поскольку я хотел не просто создать упрощенное игрушечное приложение, я также намеревался добавить аутентификацию и (простую) авторизацию в приложение.

Я не хотел сходить с ума от этого (например, реализовать полноценный  OAuth 2.0 интеграция). Тем не менее, я хотел добавить (я надеюсь) некоторые значимые функции безопасности в моем приложении AngularJS.

Отказ от ответственности:  я не эксперт по безопасности. Действуйте с осторожностью, так как это решение может не обеспечить достаточную безопасность для ваших потребностей приложения.

Случайно я наткнулся на демонстрационное приложение, которое Джош Лонг  создал некоторое время назад . Это приложение, хотя и использовало Spring Security, не интегрировалось с  Spring Security  в полной мере, и я чувствовал, что могу улучшить эту реализацию, используя  Spring Session  — новый проект, созданный лидером Spring Security  Робом Винчем .

Весенняя сессия

Спецификация  сервлета 3.0  ( JSR 315) представил несколько способов настройки обработки файлов cookie сеанса, например, изменив имя файла cookie (по умолчанию JSESSIONID) и предоставив дополнительные параметры, относящиеся к безопасности:

Тем не менее, вы все еще в значительной степени обязаны использовать куки для хранения своих идентификаторов сеансов. В тех случаях, когда вам нужна более полная гибкость для обработки ваших сессий,  Spring Session  очень удобен и предоставляет  многочисленные преимущества .

По умолчанию  Spring Session  сохраняет информацию о сеансе в Redis, используя RedisOperationsSessionRepository . Сеансы истекают по умолчанию через 30 минут, но это можно настроить с  помощью  свойства setDefaultMaxInactiveInterval . Помимо Redis  также предоставляется MapSessionRepository, позволяющий легко интегрироваться, например, с  Hazelcast .

В моем случае я хотел предоставить идентификатор сеанса не через стандартные файлы cookie, а через заголовок HTTP. К счастью,  Spring Session  предоставляет различные подключаемые стратегии для настройки этого поведения. Поскольку  Spring Session  работает как фильтр, вы должны настроить  SessionRepositoryFilter . В этом фильтре вы можете установить используемый  HttpSessionStrategy . По умолчанию он использует CookieHttpSessionStrategy . Однако для моего варианта использования я использую HeaderHttpSessionStrategy , который по умолчанию сохраняет идентификатор сеанса в заголовке HTTP, называемом  x-auth-token  (хотя это можно настроить).

На стороне клиента в моем  AngularJS приложение, я добавляю HTTP-заголовок через  $ http  к каждому запросу.

$http.defaults.headers.common['x-auth-token'] = user.token;
Это настраивается при успешном входе в систему через 
LoginController

Botanic-ng
 отправляет учетные данные для входа на сервер, который, в свою очередь, использует их для аутентификации пользователя с помощью 
Spring Security 
(
AuthenticationController
), и в случае успеха 
AuthenticationToken,
 содержащий идентификатор сеанса и роли пользователя, будет отправлен обратно клиенту.


Идентификатор сеанса на клиенте хранится только в памяти, и если вы обновляете клиент, пользователь должен повторно пройти аутентификацию.

Для полного исходного кода, пожалуйста, смотрите: