Защита Java EE с помощью Spring Security

Защита Java EE с помощью Spring Security

1. обзор

В этом кратком руководстве мы рассмотрим, какsecure a Java EE web application with Spring Security.

2. Maven Зависимости

Начнем с необходимогоSpring Security dependencies для этого урока:


    org.springframework.security
    spring-security-web
    4.2.3.RELEASE


    org.springframework.security
    spring-security-config
    4.2.3.RELEASE


    org.springframework.security
    spring-security-taglibs
    4.2.3.RELEASE

Последняя версия Spring Security (на момент написания этого руководства) - 4.2.3.RELEASE; как всегда, мы можем проверитьMaven Central на наличие последних версий.

3. Конфигурация безопасности

Далее нам нужно настроить конфигурацию безопасности для существующего приложения Java EE:

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1").password("user1Pass").roles("USER")
          .and()
          .withUser("admin").password("adminPass").roles("ADMIN");
    }
}

В методеconfigure() мы устанавливаемAuthenticationManager. Для простоты мы реализуем простую аутентификацию в памяти. Данные пользователя жестко запрограммированы.

Это предназначено для быстрого прототипирования, когда нет необходимости в полном механизме персистентности.

Затем давайте интегрировать безопасность в существующую систему, добавив классSecurityWebApplicationInitializer:

public class SecurityWebApplicationInitializer
  extends AbstractSecurityWebApplicationInitializer {

    public SecurityWebApplicationInitializer() {
        super(SpringSecurityConfig.class);
    }
}

Этот класс гарантирует, чтоSpringSecurityConfig загружается во время запуска приложения. На этом этапеwe’ve achieved a basic implementation of Spring Security. В этой реализации Spring Security по умолчанию будет требовать аутентификацию для всех запросов и маршрутов.

4. Настройка правил безопасности

Мы можем дополнительно настроить Spring Security, переопределив методWebSecurityConfigurerAdapter'sconfigure(HttpSecurity http):

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .csrf().disable()
      .authorizeRequests()
      .antMatchers("/auth/login*").anonymous()
      .anyRequest().authenticated()
      .and()
      .formLogin()
      .loginPage("/auth/login")
      .defaultSuccessUrl("/home", true)
      .failureUrl("/auth/login?error=true")
      .and()
      .logout().logoutSuccessUrl("/auth/login");
}

Используя методantMatchers(), мы настраиваем Spring Security, чтобы разрешить анонимный доступ к/auth/login и __ аутентифицировать любой другой запрос.

4.1. Пользовательская страница входа

Пользовательская страница входа настраивается с помощью методаformLogin():

http.formLogin()
  .loginPage("/auth/login")

Если это не указано, Spring Security генерирует страницу входа по умолчанию в/login:




Login

User:
Password:

4.2. Пользовательская целевая страница

После успешного входа в систему Spring Security перенаправляет пользователя в корень приложения. Мы можем переопределить это, указав URL успеха по умолчанию:

http.formLogin()
  .defaultSuccessUrl("/home", true)

Если для параметраalwaysUse методаdefaultSuccessUrl() установлено значение true, пользователь всегда будет перенаправлен на указанную страницу.

Если параметрalwaysUse не установлен или имеет значение false, пользователь будет перенаправлен на предыдущую страницу, к которой он пытался получить доступ, прежде чем ему будет предложено пройти аутентификацию.

Точно так же мы можем также указать пользовательскую целевую страницу сбоя:

http.formLogin()
  .failureUrl("/auth/login?error=true")

4.3. авторизация

Мы можем ограничить доступ к ресурсу по роли:

http.formLogin()
  .antMatchers("/home/admin*").hasRole("ADMIN")

Пользователь без прав администратора получит сообщение об ошибке «Доступ запрещен», если он / она попытается получить доступ к конечной точке/home/admin.

Мы также можем ограничить данные на странице JSP в зависимости от роли пользователя. Это делается с помощью тега<security:authorize>:


    This text is only visible to an admin
    
">Admin Page

Чтобы использовать этот тег, мы должны включить тег taglib Spring Security вверху страницы:

<%@ taglib prefix="security"
  uri="http://www.springframework.org/security/tags" %>

5. Конфигурация Spring Security XML

До сих пор мы рассматривали настройку Spring Security в Java. Давайте посмотрим на эквивалентную конфигурацию XML.

Во-первых, нам нужно создать файлsecurity.xml в папкеweb/WEB-INF/spring, который содержит наши конфигурации XML. Пример такого конфигурационного файлаsecurity.xml доступен в конце статьи.

Начнем с настройки диспетчера аутентификации и поставщика аутентификации. Для простоты мы используем простые жестко запрограммированные учетные данные пользователя:


    
        
            
        
    

Мы только что создали пользователя с именем пользователя, паролем и ролью.

Кроме того, мы можем настроить нашего провайдера аутентификации с помощью кодировщика пароля:


    
        
        
            
        
    

Мы также можем указать пользовательскую реализацию SpringUserDetailsService илиDatasource в качестве нашего поставщика аутентификации. Более подробную информацию можно найтиhere.

Теперь, когда мы настроили диспетчер аутентификации, давайте настроим правила безопасности и применим контроль доступа:


    
    
    
    

В приведенном выше фрагменте мы настроилиHttpSecurity на использование формы входа в систему и установили/secure.jsp в качестве URL-адреса успешного входа в систему. Мы предоставили анонимный доступ к/index.jsp и пути“/”. Также мы указали, что доступ к/secure.jsp должен требовать аутентификации, а аутентифицированный пользователь должен иметь, по крайней мере, уровень полномочийROLE_USER.

Установка для атрибутаauto-config тегаhttp значенияtrue инструктирует Spring Security реализовать поведение по умолчанию, которое нам не нужно переопределять в конфигурации. Следовательно,/login и/logout будут использоваться для входа и выхода пользователя соответственно. Страница входа по умолчанию также предоставляется.

Мы можем дополнительно настроить тегform-login с настраиваемыми страницами входа и выхода, URL-адресами для обработки как неудачной, так и успешной аутентификации. Security Namespace appendix перечисляет все возможные атрибуты для теговform-login (и других). Некоторые IDE также делают возможной проверку, щелкая тег и удерживая нажатой клавишуctrl.

Наконец, чтобы конфигурацияsecurity.xml загружалась во время запуска приложения, нам нужно добавить следующие определения в нашweb.xml:


    contextConfigLocation
    
      /WEB-INF/spring/*.xml
    



    springSecurityFilterChain
    
      org.springframework.web.filter.DelegatingFilterProxy



    springSecurityFilterChain
    /*



    
        org.springframework.web.context.ContextLoaderListener
    

Обратите внимание, что попытка использовать конфигурации на основе XML и Java в одном приложении JEE может привести к ошибкам.

6. Заключение

В этой статье мы увидели, как защитить приложение Java EE с помощью Spring Security, и продемонстрировали конфигурации как на основе Java, так и на основе XML.

Мы также обсудили способы предоставления или отмены доступа к определенным ресурсам в зависимости от роли пользователя.

Полный исходный код и определения XML доступныover on GitHub.