Spring Security и NetBeans

Spring Security отвечает за авторизацию пользователей. Однако, большинство иструкций по использованию Spring Security написано для Maven и простым копипастом конфигов в NetBeans не заработают. Поэтому, опишу что надо сделать, чтобы добавить в свой проект эту библиотеку.

Работает с NetBeans 7.3 и Spring 3.1.1.

Теория по Spring Security хорошо описана в переводе официальной документации.

В качестве основной статьи, по которой все сделано, используется эта.

Установка Spring Security
Spring Security не входит в NetBeans и его библиотеки надо скачать отдельно и распаковать в папку WEB-INF/lib. В оригинальной статье написано, что хватит следующих библиотек:
 * org.springframework.core-3.1.0.RELEASE.jar
 * org.springframework.beans-3.1.0.RELEASE.jar
 * org.springframework.context-3.1.0.RELEASE.jar
 * org.springframework.expression-3.1.0.RELEASE.jar
 * org.springframework.web-3.1.0.RELEASE.jar

Конфигурация Spring Security
Необходимо вставить фильтр в web.xml, Создать файл конфигурации Spring Security и добавить ссылку на него в web.xml

Cодержимое WEB-INF/web.xml
   contextConfigLocation  /WEB-INF/applicationContext.xml, /WEB-INF/spring-security.xml   org.springframework.web.context.ContextLoaderListener dispatcher org.springframework.web.servlet.DispatcherServlet 2 <servlet-mapping> dispatcher</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30       </session-timeout> </session-config> <welcome-file-list> <welcome-file>redirect.jsp</welcome-file> </welcome-file-list> <security-role> <role-name>ROLE_USER</role-name> </security-role> <security-role> <role-name>ROLE_ADMIN</role-name> </security-role> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

Содержимое WEB-INF/spring-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.5.xsd     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<http pattern="/js/**" security="none"/> <http pattern="/style/**" security="none"/> <http pattern="/img/**" security="none"/>

<http pattern="/login.htm" security="none"/> <http auto-config="true" access-denied-page="/login.htm?accessDeniedError=1"> <intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" /> <form-login authentication-failure-url="/login.htm?loginError=1" login-page="/login.htm" login-processing-url="/j_spring_security_check"/>

<authentication-manager> <authentication-provider > <password-encoder hash="md5" /> <user-service> <user name="user" password="098f6bcd4621d373cade4e832627b4f6" authorities="ROLE_USER" /> <user name="admin" password="098f6bcd4621d373cade4e832627b4f6" authorities="ROLE_USER,ROLE_ADMIN" /> </user-service> </authentication-provider> </authentication-manager> <beans:bean id="loginSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler" > <beans:property name="defaultTargetUrl" value="/index.htm"/> </beans:bean> <beans:bean id="loginFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler" > <beans:property name="defaultFailureUrl" value="/login.htm?loginError=1" /> </beans:bean> </beans:beans>

Содержимое WEB-INF/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

<context:annotation-config /> <mvc:annotation-driven />

Содержимое WEB-INF/jsp/login.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> Вход в систему Введите логин и пароль <form action="j_spring_security_check" method="POST"> <input placeholder="Введите логин" type="text" size="20" name="j_username"> <input placeholder="Введите пароль" type="password" size="20" name="j_password"> <input type="submit" value="Авторизоваться"> Демо пользователи: Логин: user Пароль: test

Логин: admin Пароль: test

В доступности login.htm надо позаботиться отдельно в контроллере (здесь код не представлен).

Аутентификация из базы данных
Бывают ситуации, что необходимо аутентифицироваться из базы данных. Для этого можно использовать встроенный в Spring Security механизм, работающий на основе JDBC.

Пусть имеем две таблицы Users и Roles.

В Users: id, name, password, status

В Roles: id, role

Тогда в spring-security.xml надо заменить authentication-provider на следующий: <authentication-manager > <authentication-provider > <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select name as username, password, status as enabled from users where name=?" authorities-by-username-query="select users.name as username, roles.role as authorities from users, roles where users.id = roles.id and users.name = ? "/> <password-encoder hash="md5" /> </authentication-provider> </authentication-manager>

При этом, в web.xml должен быть добавлен WEB-INF/jdbc.xml:  contextConfigLocation</param-name>  /WEB-INF/applicationContext.xml, /WEB-INF/spring-security.xml, /WEB-INF/jdbc.xml </param-value> </context-param>

В WEB-INF/jdbc.xml хранится бин dataSource для подключения к БД: <beans xmlns="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-3.0.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver" /> <property name="url" value="jdbc:derby://localhost:1527/dbname" /> <property name="username" value="dbuser" /> <property name="password" value="dbpassword" />