Pull to refresh

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

Здравствуйте. Если вы только начали изучать 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:

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



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



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



Готово, надеюсь у вас все вышло. Вот этот проект на GitHub: Spring Security
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.