Spring Security Form Войти

Spring Security Form Войти

1. Вступление

Эта статья будет посвященаLogin with Spring Security. Мы собираемся построить на основе простыхprevious Spring MVC example, поскольку это необходимая часть настройки веб-приложения вместе с механизмом входа в систему.

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

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

Краткий пример перенаправления после входа в Spring Security

Read more

Две страницы входа с Spring Security

Краткое и практическое руководство по настройке Spring Security с двумя отдельными страницами входа.

Read more

Spring Security Form Войти

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

Read more

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

Чтобы добавить в проект зависимости Maven, см.Spring Security with Maven article. Потребуются как стандартныеspring-security-web, так иspring-security-config.

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

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

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    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");
    }

    @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()
          .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());
    }

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

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

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

3.1. authorizeRequests()с

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

Обратите внимание, что порядок элементовantMatchers() имеет значение -the more specific rules need to come first, followed by the more general ones.

3.2. formLogin()с

Это имеет несколько методов, которые мы можем использовать для настройки поведения формы входа в систему:

  • loginPage() custom login page

  • loginProcessingUrl() - URL для отправки имени пользователя и пароля

  • defaultSuccessUrl() - целевая страница после успешного входа в систему

  • failureUrl() - целевая страница после неудачного входа в систему

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

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

Starting with Spring 5, we also have to define a password encoder. В нашем примере мы использовалиBCryptPasswordEncoder.

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

Чтобы использовать определенную выше конфигурацию Spring Security, нам нужно присоединить ее к веб-приложению. В этом случае нам не нужныweb.xml:

public class AppInitializer
  extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class[] getRootConfigClasses() {
        return new Class[] {SecSecurityConfig.class};
    }
}

Обратите внимание, что в этом инициализаторе нет необходимости, если мы используем приложение Spring Boot. Взгляните на нашу статью оSpring Boot security auto-configuration, чтобы узнать больше о том, как конфигурация безопасности загружается в 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 Security вweb.xml - только дополнительный фильтр, добавленный к стандартному Spring MVCweb.xml:

Spring Secured Application






    springSecurityFilterChain
    org.springframework.web.filter.DelegatingFilterProxy


    springSecurityFilterChain
    /*

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

7. Форма входа

Страница формы входа будет зарегистрирована в Spring MVC с использованием простого механизмаmap views names to URLs без необходимости в явном контроллере между ними:

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

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




   

Login

User:
Password:

Spring Login form имеет следующие релевантные артефакты:

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

  • username - имя пользователя

  • password - пароль

8. Дальнейшая настройка Spring Login

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

Одна из причин переопределить большинство значений по умолчанию в Spring Security - установитьhide the fact that the application is secured with 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. Страница входа в систему

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

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

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

login-page='/login.html'

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

8.2. URL-адрес POST для входа

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

Мы можем использовать методloginProcessingUrl, чтобы переопределить этот 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?по умолчанию.

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

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

Или с XML:

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

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

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

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

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

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