Интеграция Spring Security в Spring MVC

в 0:00, , рубрики: java, метки: , , ,

Здравствуйте. Если вы только начали изучать Spring Framework, то в этой статье я объясню как подключать Spring Security в Spring MVC на базе IDE IntelliJ IDEA. Этот пример для новичков, поэтому попробую объяснить максимально просто и прокомментировать весь код.

Для начала, что же такое Spring Security? Это Java Framework который предоставляет механизмы построения систем аутентификации и авторизации, а также другие возможности обеспечения безопасности для промышленных приложений, созданных с помощью Spring Framework.

Первое что нам потребуется это создать Maven проект. В правом нижнем углу появится окно, щелкаем Enable Auto-Import, для автоматического импорта внесенных данных:
Интеграция Spring Security в Spring MVC - 1

В 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:

image

После этого в наш проект была добавлен папка 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 дважды кликаем по недостающим элементам:

Интеграция Spring Security в Spring MVC - 3

Теперь настраиваем Tomcat:

Интеграция Spring Security в Spring MVC - 4

И следует добавить наш артефакт в deployment:

Интеграция Spring Security в Spring MVC - 5

Готово, надеюсь у вас все вышло. Вот этот проект на GitHub: Spring Security

Автор: друже

Источник

* - обязательные к заполнению поля