Несколько дней назад я были в середине подготовки к моему 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) и предоставив дополнительные параметры, относящиеся к безопасности:
- https://blog.whitehatsec.com/tag/jsessionid/
- https://www.owasp.org/index.php/HttpOnly
- http://software-security.sans.org/blog/2010/08/11/security-misconfigurations-java-webxml-files
Тем не менее, вы все еще в значительной степени обязаны использовать куки для хранения своих идентификаторов сеансов. В тех случаях, когда вам нужна более полная гибкость для обработки ваших сессий, 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,
содержащий идентификатор сеанса и роли пользователя, будет отправлен обратно клиенту.
Идентификатор сеанса на клиенте хранится только в памяти, и если вы обновляете клиент, пользователь должен повторно пройти аутентификацию.
Для полного исходного кода, пожалуйста, смотрите: