Рубрики
Без рубрики

Обеспечение безопасности Jakarta EE с помощью Spring Security

Узнайте, как защитить веб-приложение Jakarta EE с помощью Spring Security.

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы рассмотрим, как защитить веб-приложение Jakarta EE с помощью Spring Security .

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

Давайте начнем с необходимых зависимостей безопасности Spring для этого урока :


    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. Конфигурация безопасности

Затем нам нужно настроить конфигурацию безопасности для существующего приложения Jakarta 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() мы настраиваем Диспетчер аутентификации|/. Для простоты мы реализуем простую аутентификацию в памяти. Данные пользователя жестко закодированы.

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

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

public class SecurityWebApplicationInitializer
  extends AbstractSecurityWebApplicationInitializer {

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

Этот класс обеспечит загрузку конфигурации Spring Security во время запуска приложения. На данном этапе мы достигли базовой реализации Spring Security . При такой реализации Spring Security по умолчанию потребует проверки подлинности для всех запросов и маршрутов.

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

Мы можем дополнительно настроить безопасность Spring, переопределив WebSecurityConfigurerAdapter ‘s configure(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. Пользовательская страница Входа в систему

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

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

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




Login

User:
Password:

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


    
        
            
        
    

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

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


    
        
        
            
        
    

Мы также можем указать пользовательскую реализацию Spring UserDetailsService или Источник данных в качестве поставщика аутентификации. Более подробную информацию можно найти здесь.

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


    
    
    
    

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

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

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

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

                                                                           
    contextConfigLocation                                        
                                                                             
      /WEB-INF/spring/*.xml                                                             
                                                                            
                                                                          
                                                                                          
                                                                                  
    springSecurityFilterChain                                  
    
      org.springframework.web.filter.DelegatingFilterProxy     
                                                                                 
                                                                                          
                                                                          
    springSecurityFilterChain                                  
    /*                                                         
                                                                         
                                                                                          
                                                                                
    
        org.springframework.web.context.ContextLoaderListener
    

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

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

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

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

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