Приветствую всех любителей 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.
This comment has been removed by the author.
ReplyDeleteСпасибо за Ваш код, но давайте разъясним ситуацию. Кому нужно приложение, если о нем никто не узнает?Я вижу только один выход из этой ситуации - заказать комплексный маркетинг мобильных приложений в компании apppromo.net для достижения ТОПа по категории или запросу.
ReplyDelete