2012-10-05

Spring Security: Защити свое приложение

Приветствую всех любителей Spring :)

Сразу прошу простить за долгий перерыв. Причиной тому и наши гастроли во Львовe и подготовка выступления в Киеве, а также куча всякой мелочи в виде необходимости зарабатывать на жизнь :) Есть интересный проекты - напишите мне.

В данной статье я хотел бы показать пример настройки Spring Security для веб проекта. Делать то, чего 100500 раз понаписано в интернетах я не хотел, моя цель была сделать что-то полезное и информативное. Поэтому я попробовал сделать пример не таким тривиальным как в интернетах, кроме того, код как обычно в нашем проекте на GitHub.

Ну как обычно это работает примерно как магия раз-два-три:

Раз. Фильтры web.xml:

Для ограничение доступа к своим страницам SS использует servlet filter (рекомендую почитать как это работает, если кто запамятовал, чтоб понимать что происходит дальше. А вообще вот и реализация Chain of Responsibility, которую так часто любят спрашивать на собесах).

Два. Контекст. Я предлагаю создать отдельный контекст (и включить его потом в application-context). В этом же контексте лучше всего использовать security namespace:

На первой части останавливаться не буду. Так я подключаю нужные мне компоненты и отфильтровываю  ненужные.
Начнем в тега http. Документация говорит что минимальная необходимая функциональность это использование атрибута auto-config, который является шорткатом (см. документацию). В данном случае я прошу SS сгенерировать мне форму логина и форму логаута, а также описываю поведение при попадании на определенный url pattern (как работает описано тут).
Для формы существует масса дополнительных атрибутов с которыми я рекомендую ознакомиться. 
Наличие же тега authentication-manager говорит о том как я буду осуществлять аутентификацию. В моем случае я делегирую это userService, который я имплементировал как компонент. Также я использую хеширование пароля с использованием sha, а также salt в виде username (в моем случае как мы увидим из UserService это email). Пользователей с их правами доступа можно хранить прямо в контексте, как показано в большинстве тривиальных примеров.
Для упрощения я мог бы использовать  стандартную схему БД и вместо моего сервиса передавать Data Source этой базы.

Детали: Кастомная форма логина/логаута
Для использование своей собственной формы, вместо сгенерированной, вам необходимо указать ее в теге login-form. Кроме того вам придется использовать именование полей формы по умолчанию (как тут). Аналогично с формой logout. По умолчанию она logout осуществляется по адресу /j_spring-security_logout

Детали: Роли пользователей
В теге intercept-url я могу указать роль пользователя. Таким образом я могу сделать иерархическую структуру безопасности.

Детали: Интеграция с LDAP
Этому посвящена целая глава мануала.


Три (как видно из прошлого пункта шаг не обязательный) Имплементация UserDetailsService:

  Это тянет за собой создание entity, ее добавления к persistence entities, создание Dao (да простят мне читатели использование олдскульного нетипизированного criteria API, обещаю поправить  на Hibernate 4 style), а также создание адаптера, чтоб возвращать объект имплементирующий UserDetails.

Детали: Создание пользователей
При хранении пароль в виде хеша не задудьте что вам необходимо после регистрации захешировать пароль с сохранить его в базе.


Про добавление зависимостей в maven писать не буду. Кому надо тот посмотрит в коде проекта, а кто не использует maven тому будет неинтересно.

Из того, что не добавил, но стоит сделать это Service Layer Security.  Мощный механизм и простой как раз-два-три.

 Рекомендованная литература: Spring Security documentation, Spring Security Tutorial

Дальше опять про AOP, Spring Shell, @Cachable, Spring Data для Neo4j и еще немного про Conversion & Formatting Service.
Всего всего - ваши me & eugene. Stay tuned.

2 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. Спасибо за Ваш код, но давайте разъясним ситуацию. Кому нужно приложение, если о нем никто не узнает?Я вижу только один выход из этой ситуации - заказать комплексный маркетинг мобильных приложений в компании apppromo.net для достижения ТОПа по категории или запросу.

    ReplyDelete