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

Вход в форму безопасности Spring

Пример весеннего входа в систему – Как настроить простую форму входа в систему, базовую конфигурацию XML безопасности и некоторые более продвинутые методы настройки.

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

1. введение

Эта статья будет посвящена Входу в систему с помощью Spring Security . Мы собираемся построить на основе простого предыдущего примера Spring MVC , поскольку это необходимая часть настройки веб – приложения вместе с механизмом входа в систему.

Дальнейшее чтение:

Spring Security – Перенаправление на предыдущий URL-адрес после входа в систему

Две страницы входа в систему с защитой Spring

Вход в форму безопасности Spring

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

При работе с Spring Boot spring-boot-starter-security starter автоматически включает все зависимости, такие как spring-security-core , spring-security-web и |/spring-security-config среди других:


    org.springframework.boot
    spring-boot-starter-security
    2.3.3.RELEASE

В случае, если мы не используем Spring Boot , пожалуйста, ознакомьтесь со статьей Spring Security with Maven , в которой описано, как добавить все необходимые зависимости. Потребуются как стандартные spring-security-web , так и spring-security-config .

3. Конфигурация Java Spring Security

Давайте начнем с создания класса конфигурации безопасности Spring, который расширяет WebSecurityConfigurerAdapter.

Добавив @EnableWebSecurity , мы получим поддержку Spring Security и интеграции MVC:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
        // authentication manager (see below)
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        // http builder configurations for authorize requests and form login (see below)
    }
}

В этом примере мы использовали аутентификацию в памяти и определили 3 пользователя.

Далее мы рассмотрим элементы, которые мы использовали для создания конфигурации входа в форму.

Давайте сначала создадим наш менеджер аутентификации.

3.1. Менеджер аутентификации

Поставщик аутентификации поддерживается простой реализацией в памяти – InMemoryUserDetailsManager в частности. Это полезно для быстрого прототипирования, когда полный механизм сохранения еще не нужен:

protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
        .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
        .and()
        .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER")
        .and()
        .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN");
}

Здесь мы настраиваем трех пользователей с жестко запрограммированными именем пользователя, паролем и ролью.

Начиная с весны 5, мы также должны определить кодировщик паролей . В нашем примере мы использовали BCryptPasswordEncoder:

@Bean 
public PasswordEncoder passwordEncoder() { 
    return new BCryptPasswordEncoder(); 
}

Далее, давайте настроим безопасность Http.

3.2. Конфигурация для авторизации запросов

Мы начинаем с выполнения необходимых конфигураций для авторизации запросов.

Здесь мы разрешаем анонимный доступ в /login , чтобы пользователи могли аутентифицироваться. Ограничение /admin ролями ADMIN и защита всего остального:

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http
      .csrf().disable()
      .authorizeRequests()
      .antMatchers("/admin/**").hasRole("ADMIN")
      .antMatchers("/anonymous*").anonymous()
      .antMatchers("/login*").permitAll()
      .anyRequest().authenticated()
      .and()
      // ...
}

Обратите внимание, что порядок элементов antMatchers() важен – сначала должны быть более конкретные правила, а затем более общие .

3.3. Конфигурация для входа в форму

Затем мы расширяем приведенную выше конфигурацию для входа в форму и выхода из системы:

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http
      // ...
      .and()
      .formLogin()
      .loginPage("/login.html")
      .loginProcessingUrl("/perform_login")
      .defaultSuccessUrl("/homepage.html", true)
      .failureUrl("/login.html?error=true")
      .failureHandler(authenticationFailureHandler())
      .and()
      .logout()
      .logoutUrl("/perform_logout")
      .deleteCookies("JSESSIONID")
      .logoutSuccessHandler(logoutSuccessHandler());
}
  • LoginPage() – пользовательская страница входа в систему
  • loginProcessingUrl() – URL-адрес для отправки имени пользователя и пароля
  • defaultSuccessUrl() – целевая страница после успешного входа в систему
  • failureUrl() – целевая страница после неудачного входа в систему
  • logoutUrl() – пользовательский выход из системы

4. Добавьте Spring Security в веб-приложение

Чтобы использовать указанную выше конфигурацию безопасности Spring, нам нужно прикрепить ее к веб-приложению.

Мы будем использовать WebApplicationInitializer , поэтому нам не нужно предоставлять какие-либо web.xml:

public class AppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) {

        AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
        root.register(SecSecurityConfig.class);

        sc.addListener(new ContextLoaderListener(root));

        sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain"))
          .addMappingForUrlPatterns(null, false, "/*");
    }
}

Обратите внимание, что этот инициализатор не нужен, если мы используем приложение Spring Boot. Ознакомьтесь с нашей статьей об автоматической настройке безопасности Spring Boot для получения более подробной информации о том, как конфигурация безопасности загружается в Spring Boot.

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

Давайте также рассмотрим соответствующую конфигурацию XML.

Весь проект использует конфигурацию Java, поэтому нам нужно импортировать файл конфигурации XML через класс Java @Configuration :

@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
public class SecSecurityConfig {
   public SecSecurityConfig() {
      super();
   }
}

И конфигурация XML Spring Security – webSecurityConfig.xml :


    
    

    
    



    
        
            
        
        
    



6. web.xml

До введения Spring 4 мы использовали для настройки конфигурации безопасности Spring в web.xml – только дополнительный фильтр, добавленный к стандартному Spring MVC web.xml :

Spring Secured Application






    springSecurityFilterChain
    org.springframework.web.filter.DelegatingFilterProxy


    springSecurityFilterChain
    /*

Фильтр – DelegatingFilterProxy – просто делегирует управляемый Spring компонент – FilterChainProxy – который сам может извлечь выгоду из полного управления жизненным циклом Spring bean и тому подобного.

7. Форма Входа В Систему

Страница формы входа будет зарегистрирована в Spring MVC с использованием простого механизма сопоставления имен представлений с URL-адресами без необходимости в явном контроллере между ними:

registry.addViewController("/login.html");

Это, конечно, соответствует login.jsp :




   

Login

User:
Password:

Форма входа Spring имеет следующие соответствующие артефакты:

  • login – URL-адрес, на котором размещена форма для запуска процесса аутентификации
  • имя пользователя – имя пользователя
  • пароль – пароль

8. Дальнейшая Настройка Весеннего Входа в Систему

Мы кратко обсудили несколько конфигураций механизма входа в систему, когда мы ввели конфигурацию безопасности Spring выше – давайте теперь рассмотрим некоторые детали.

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

Полностью настроенный элемент входа выглядит следующим образом:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.formLogin()
      .loginPage("/login.html")
      .loginProcessingUrl("/perform_login")
      .defaultSuccessUrl("/homepage.html",true)
      .failureUrl("/login.html?error=true")
}

Или соответствующая конфигурация XML:

8.1. Страница Входа В Систему

Далее давайте посмотрим, как мы можем настроить пользовательскую страницу входа в систему с помощью метода login Page():

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

Или через конфигурацию XML:

login-page='/login.html'

Если мы не уточним это, Spring Security создаст очень простую форму входа в систему по URL-адресу /login .

8.2. URL-адрес ЗАПИСИ для входа в систему

URL-адрес по умолчанию, где будет размещен весенний логин для запуска процесса аутентификации, – это /login , который раньше был /j_spring_security_check до Spring Security 4 .

Мы можем использовать метод URL-адрес обработки входа для переопределения этого URL-адреса:

http.formLogin()
  .loginProcessingUrl("/perform_login")

Или через конфигурацию XML:

login-processing-url="/perform_login"

Хорошая причина переопределить этот URL-адрес по умолчанию заключается в том, чтобы скрыть тот факт, что приложение действительно защищено с помощью Spring Security – эта информация не должна быть доступна извне.

8.3. Целевая страница об Успехе

После успешного входа в систему пользователь перенаправляется на страницу, которая по умолчанию является корнем веб – приложения.

Мы можем переопределить это с помощью метода defaultSuccessUrl() :

http.formLogin()
  .defaultSuccessUrl("/homepage.html")

Или с конфигурацией XML:

default-target-url="/homepage.html"

В случае, если always-use-default-target имеет значение true, пользователь всегда перенаправляется на эту страницу. Если этот атрибут имеет значение false, то пользователь будет перенаправлен на предыдущую страницу, которую он хотел посетить, прежде чем ему будет предложено пройти аутентификацию.

8.4. Целевая страница при Сбое

Как и в случае со страницей входа, страница сбоя входа автоматически генерируется Spring Security в /login? ошибка по умолчанию.

Чтобы переопределить это, мы можем использовать метод failure Url() :

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

Или с помощью XML:

authentication-failure-url="/login.html?error=true"

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

В этом примере Spring Login мы настроили простой процесс аутентификации – мы обсудили форму входа в систему Spring Security, конфигурацию безопасности и некоторые из более продвинутых доступных настроек.

Реализацию этого учебника по весеннему входу в систему можно найти в проекте GitHub – это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.

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

http://localhost:8080/spring-security-mvc-login/login.html