Введение в Java Config для Spring Security

Введение в Java Config для Spring Security

1. обзор

Это статьяan introduction to Java configuration for Spring Security, которая позволяет пользователям легко настраивать Spring Security без использования XML..

Конфигурация Java была добавлена ​​в среду Spring вSpring 3.1 и расширена до Spring Security вSpring 3.2 и определена в аннотированном классе@Configuration.

2. Maven Setup

Чтобы использовать Spring Security в проектах Maven, нам сначала нужно иметь зависимостьspring-security-core в проектеpom.xml:


    org.springframework.security
    spring-security-core
    4.1.3.RELEASE

Последнюю версию всегда можно найтиhere.

3. Веб-безопасность с конфигурацией Java

Начнем с базового примера конфигурации Java Spring Security:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
      throws Exception {
        auth.inMemoryAuthentication().withUser("user")
          .password("password").roles("USER");
    }
}

Как вы могли заметить, конфигурация устанавливает базовую конфигурацию аутентификации в памяти.

4. HTTP Security

Чтобы включить безопасность HTTP в Spring, нам нужно расширитьWebSecurityConfigurerAdapter, чтобы обеспечить конфигурацию по умолчанию в методеconfigure(HttpSecurity http):

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .anyRequest().authenticated()
      .and().httpBasic();
}

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

Кроме того, это в точности похоже на следующую конфигурацию XML:


    
    
    

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

Интересно, что Spring Security автоматически создает страницу входа в систему на основе включенных функций и использования стандартных значений для URL-адреса, который обрабатывает отправленное имя входа:

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .anyRequest().authenticated()
      .and().formLogin()
      .loginPage("/login").permitAll();
}

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

6. Авторизация с ролями

Теперь давайте настроим простую авторизацию для каждого URL с помощью ролей:

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/", "/home").access("hasRole('USER')")
      .antMatchers("/admin/**").hasRole("ADMIN")
      .and()
      // some more method calls
      .formLogin();
}

Обратите внимание на то, как мы используем как типобезопасный API -hasRole, - так и API на основе выражений черезaccess.

7. Выйти

Как и во многих других аспектах Spring Security, выход из системы имеет несколько отличных настроек по умолчанию.

По умолчанию запрос на выход делает сеанс недействительным, очищает все кеши аутентификации, очищаетSecurityContextHolder и перенаправляет на страницу входа.

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

protected void configure(HttpSecurity http) throws Exception {
    http.logout();
}

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

protected void configure(HttpSecurity http) throws Exception {
    http.logout().logoutUrl("/my/logout")
      .logoutSuccessUrl("/my/index")
      .logoutSuccessHandler(logoutSuccessHandler)
      .invalidateHttpSession(true)
      .addLogoutHandler(logoutHandler)
      .deleteCookies(cookieNamesToClear)
      .and()
      // some other method calls
}

8. Аутентификация

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

8.1. Аутентификация в памяти

Мы начнем с простой конфигурации в памяти:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
  throws Exception {
    auth.inMemoryAuthentication()
      .withUser("user").password("password").roles("USER")
      .and()
      .withUser("admin").password("password").roles("USER", "ADMIN");
}

8.2. JDBC аутентификация

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

@Autowired
private DataSource dataSource;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
  throws Exception {
    auth.jdbcAuthentication().dataSource(dataSource)
      .withDefaultSchema()
      .withUser("user").password("password").roles("USER")
      .and()
      .withUser("admin").password("password").roles("USER", "ADMIN");
}

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

В этом кратком руководстве мы рассмотрели основы конфигурации Java для Spring Security и сосредоточились на примерах кода, иллюстрирующих простейшие сценарии конфигурации.