18 октября 2008

Пример использования Spring Security в Web приложениях


Вступление


Не так давно Spring анонсировала свою новую разработку Spring Security. Это модуль для услуг безопасности, который должен заменить Acegi Security для всех Spring приложений.
Acegi очень популярный фреймворк для безопасности, обладающий обширной функциональностью:
- аутентификация и авторизация пользователей
- контроль доступа
Spring Security унаследовало всё лучшее от Acegi, а также обзавелось новыми фичами(features) :
- совместимость с OpenID, NTLM, LDAP аутентификация;
- поддержка аннотаций согласно стандарту JSR-250;
- упрощения в использовании;
- поддержка дополнительных языков;
и многие другие.

Пример

Что бы показать на сколько просто использовать Spring Security рассмотрим простой пример.
Для начала вам понадобиться любое простое Spring MVC веб приложение. В одном из более ранних постов я приводил примеры туториалов. Хотя, идеальной подойдёт пример petclinic , который поставляется в zip архиве spring-framework with dependencies.
Также нам понадобиться zip архив Spring Security 2.0.X , а точнее библиотеки из него.
Из которого надо в WEB-INF\lib скопировать следующие библиотеки:
spring-security-core-2.0.4.jar
spring-security-core-tiger-2.0.4.jar
spring-security-acl-2.0.4.jar
spring-security-taglibs-2.0.4.jar

И ещё одна библиотека от apache:
commons-codec-1.3.jar

Ещё необходимо создать конфигурационный файл для Spring Security в папке WEB-INF :
<!-- applicationContext-security.xml -->
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
<!-- alot of config will be here -->
</beans:beans>


Шаг следующий - настройка web.xml , где мы должны подключить конфиг для Spring Security:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-security.xml
</param-value>
</context-param>

Здесь же в web.xml сразу после закрытия тега /context-param добавляем фильтр:

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

И последний шаг - настраиваем доступ к страницам, указываем для SpringSecurity на какие странице можно заходить анонимно, а на которые доступ получат только авторизированные пользователи. Добавляем в aplicationContext-security.xml следующий код:
<http auto-config="true">
<intercept-url pattern="/*.do" access="ROLE_USER" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
</http>

В этом же файле создадим парочку пользователей:
<authentication-provider>
<password-encoder hash="md5"/>
<user-service>
<user name="rod" password="a564de63c2d0da68cf47586ee05984d7" authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" />
<user name="dianne" password="65d15fe9156f9c4bbffd98085992a44e" authorities="ROLE_USER,ROLE_TELLER" />
</user-service>
</authentication-provider>

Можно тестировать. Запускаем сервер и пытаемся открыть домашнюю страницу, ваш запрос должен быть перехвачен и вместо данных вывестись форма с предложением ввести свои данные. Вы можете попробовать ввести
логин: rod , пароль: koala
либо
логин: dianne , пароль: emu
и увидеть ожидаемую страницу.
Ещё не помешает добавить кнопку для выхода из аккаунта, лучше всего в шаблон, например в header :
<table class="header">
<tr>
<td><a href="<c:url value="/welcome.do"/>">Home</a></td>
<td align="right"><a href="<c:url value="/j_spring_security_logout"/>">Logout</a></td>
</tr>
</table>

Оригинал: статья 1 , статья 2.

2 комментария:

Dima_s_d_s комментирует...

org.springframework.web.filter.DelegatingFilterProxy
Хм, а нужную библиотеку не подключили

Alexander комментирует...

Может быть есть пример Spring Security с использованием RMI? Был бы очень благодарен