Совместное использование Struts и Spring Security

Итак, задача - прикрутить к уже существующему веб-приложению на основе Struts2 аутентификацию и авторизацию с помощью Spring Security 3 (являющегося наследником Acegi Security). Информация о пользователях будет браться из базы данных (в моём случае - СУБД MySQL). Постараюсь осветить все моменты, необходимые для того, чтобы это ЗАРАБОТАЛО. В статье не расматривается настройка Spring Security для авторизации к ресурсам.

Условимся, что приложение, основанное на Struts уже имеется и нормально функционирует (подключены все необходимые библиотеки). Итак, для начала нам понадобятся:

Скачанные архивы распаковываем, сожержимое подпапок dist (библиотеки фреймворков) перемещаем в папку WEB-INF\lib нашего проекта. В качестве контейнера сервлетов использовался Apache Tomcat 6. Сразу же важное замечание - Spring требует Servlet API версии 2.5 и старше. Нужная библиотека уже содержится в Tomcat 6. ВАЖНО: к проекту не должно быть подключено старых версий servlet-api.jar. Иначе будут ошибки. При использовании Apache Tomcat 6 о наличии актуальной библиотеки servlet-api.jar можно не беспокоиться - она уже там есть.

Что же нужно сделать, чтобы добавить к приложению аутентификацию польлователей и авторизацию ресурсов? Для начала дополняем web.xml следующими строками (отмечено красным):

(скачать web.xml)
ВАЖНО: фильтр springSecurityFilterChain должен быть объявлен до фильтра struts.
В параметре contextConfigLocation указывается месторасположение applicationContext-security.xml - файла конфигурации Spring Security (он будет рассмотрен ниже).
Как я понял log4j необходим для работы Spring. Поэтому параметром log4jConfigLocation задаётся конфигурационный файл для него. ОБЯЗАТЕЛЬНО должен располагаться в WEB-INF\classes. Сам файл можно взять из архива со Spring Security (в директории файл spring-security-samples-tutorial-3.0.5.RELEASE - туторный проект; разархивируйте его арфиватором и найдите файл log4j.properties). Параметр webAppRootKey необходимо изменить следующим образом: в строке lease.root заменить lease на контекст вашего веб-приложения. С лиснерами (в самом конце файла web.wxml) я не разбирался. Просто добавьте их.

Перед тем как перейти к рассмотрению файла конфигурации Spring Security, остановимся на вопросе с СУБД. В наши задачи входит использование базы данных для хранения информации о пользователях. Я использовал СУБД MySQL, но на деле это может быть любая СУБД, драйвер которой поддерживается Spring'ом. Пойдём по пути наименьшего сопротивления и будем использовать такую схему таблиц базы данных, которую Security понимает без дополнительного описания. Выглядит она так:

Или код для создания в MySQL:

CREATE TABLE users(
	username  VARCHAR(20) NOT NULL,
	`password`  VARCHAR(20) NOT NULL,
	enabled boolean,
	PRIMARY KEY (username)
);

CREATE TABLE authorities(
	username  VARCHAR(20) NOT NULL,
	authority  VARCHAR(20) NOT NULL,
	PRIMARY KEY (username),
	FOREIGN KEY (username) REFERENCES users (username)
);

insert into users values('someuser','123',true);
insert into authorities values('someuser','ROLE_USER');
Таким образом, мы создали пользователя с именем 'someuser', паролем 123 и правами ROLE_USER.

Тепрь расмотрим applicationContext-security.xml - файл конфигурации Spring Security. Выглядит он так:

(скачать applicationContext-security.xml)
Подключение к СУБД находится в ‹beans:bean id="dataSource"›. Параметр ‹beans:property name="url" value="jdbc:mysql://localhost/acegi" /› содержит строку подключения, где acegi необходимо заменить на название своей базы данных. Данные о пользователях беруься из БД благодаря настройке authentication-provider'а:
‹jdbc-user-service data-source-ref="dataSource" /›
Остальные настройки этого файла (собственно, сама настройка авторизации пользователей при доступе к ресурсам) довольно подробно освящены на различных ресурсах в интернете. От себя же очень рекомендую вот эти два видео:
Introduction to Spring Security 3/3.1 (примерно 1 ч 20 мин)
Oredev 2008 - Java - Introducing Spring Security (около 40 мин)
Оба видео на английском языке. Вам может показаться, что потратит 2 часа - это много. Однако, я вам гарантирую, что после просмотра вы будете неплохо разбираться в различныых способах авторизации с использованием Spring Security.

Struts, Acegi Security, Spring Security, dataSource, database, authentication, Struts и Spring Security
Сайт управляется системой uCoz