Здравствуйте. Если вы только начали изучать Spring Framework, то в этой статье я объясню как подключать Spring Security в Spring MVC на базе IDE IntelliJ IDEA. Этот пример для новичков, поэтому попробую объяснить максимально просто и прокомментировать весь код.
Для начала, что же такое Spring Security? Это Java Framework который предоставляет механизмы построения систем аутентификации и авторизации, а также другие возможности обеспечения безопасности для промышленных приложений, созданных с помощью Spring Framework.
Первое что нам потребуется это создать Maven проект. В правом нижнем углу появится окно, щелкаем Enable Auto-Import, для автоматического импорта внесенных данных:
В pom.xml нам потребуются базовые зависимости для Spring MVC, Security и сервлетов:
<properties>
<spring-framework-version>4.0.5.RELEASE</spring-framework-version>
<spring-security-version>4.0.1.RELEASE</spring-security-version>
<hibernate.version>4.3.5.Final</hibernate.version>
</properties>
<dependencies>
<!-- MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-framework-version}</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring-security-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring-security-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring-security-version}</version>
</dependency>
</dependencies>
Далее, заходим в File → Project Structure → Выбираем слева в меню Modules и удаляем пустой Spring который был создан при подключение библиотек в pom.xml. Затем нам необходимо подключить модули Spring Security и Spring MVC. Для этого мы нажимаем правой кнопкой мыши по папке нашего проекта и выбираем Add Framework Support. В нем ставим галочку напротив Spring, Spring MVC, Spring Security. В Spring также необходимо поставить галочку возле «Create empty spring-config.xml», что бы нам также создало пустой конфигурационный файл Spring'a:
После этого в наш проект была добавлен папка Web. В WEB-INF нам не хватает security-context.xml, поэтому мы создадим его сами (ПКМ на WEB-INF → New → XML Configuration File → Spring Config). Файл мы создали, но к проекту он все еще не подключен. Для этого заходим в web.xml, там видим тег param value и подключенный applicationContext.xml. После него делаем отступ и вводим "/WEB-INF/security-context.xml". Лучше всего это оформить в таком виде:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/security-context.xml
</param-value>
</context-param>
В web.xml нам также нужно подключить фильтры Spring Security. Они считывают информацию о пользователях из нужного места и строят Spring Security объекта Authentication. И не забываем создать новый servlet-mapping с именем «dispatcher» и путем "/". После </servlet-mapping> добавляем такой код:
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<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>
Теперь когда у нас все подключено, пора приступать к настройке. Переходим к dispatcher-servlet.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: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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven/> <!-- Включает такие теги как @RequestMapping, @RestController и т.д., т.е. те, которые нужны для работы Spring MVC -->
<context:component-scan base-package="com"/><!-- Эта строчка включает auto scanning спринга, так он понимает где ему искать аннотированные классы, чтобы зарегистрировать их как бины в спринговском контексте -->
<!-- С помощью этого бина ViewResolver мы указываем где лежат наши View -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"/>
</bean>
<context:annotation-config/> <!-- Используется для активации аннотаций в компонентах, уже зарегистрированных в контексте приложения -->
</beans>
Я скинул весь код не просто так, проверьте что у вас подключено в beans и сравните с этим. Для удобства создайте в папке WEB-INF папку view и перенесите туда index.jsp. Также создайте в папке java папку com и в ней класс Controller. В нем создадим базовый запрос:
package com;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@org.springframework.stereotype.Controller
public class Controller {
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView main(){
return new ModelAndView("index");
// Запрос по точке входа "/" будет выводить нам index.jsp, а найдет он его благодаря нашему dispatcher-servlet
}
}
Осталось настроить security-context:
<?xml version="1.0" encoding="UTF-8"?>
<b:beans xmlns:b="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<http auto-config="true"> <!-- Это сокращенный синтаксис, отвечает за установку логина на основе веб-формы, базовый логин и выход из приложения -->
<intercept-url pattern="/" access="hasRole('ROLE_ADMIN')"/> <!-- Задает шаблон, с которым сравниваются URL-адреа входящих запросов, тоесть что бы попасть в любой файл(так как у нас в pattern="/") нам нужно иметь доступ админа -->
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="admin" authorities="ROLE_ADMIN"/> <!-- Добавляем пользователя который будет иметь права админа -->
</user-service>
</authentication-provider>
</authentication-manager>
</b:beans>
Также нам необходимо добавить библиотеки в наш артефакт. Заходим в File → Project Structure → Выбираем слева в меню Artifacts и в Available Elements дважды кликаем по недостающим элементам:
Теперь настраиваем Tomcat:
И следует добавить наш артефакт в deployment:
Готово, надеюсь у вас все вышло. Вот этот проект на GitHub: Spring Security
Автор: друже