«1. Обзор

Эта статья представляет собой введение в конфигурацию Java для Spring Security, которая позволяет пользователям легко настраивать Spring Security без использования XML.

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

2. Настройка Maven

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

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>5.3.3.RELEASE</version>
</dependency>

Последняя версия всегда может быть нашел здесь.

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

Давайте начнем с простого примера конфигурации Spring Security Java:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

Как вы могли заметить, конфигурация устанавливает базовую конфигурацию аутентификации в памяти. Кроме того, начиная с Spring 5, нам нужен bean-компонент PasswordEncoder:

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

4. Безопасность HTTP

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

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

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

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

<http>
    <intercept-url pattern="/**" access="isAuthenticated()"/>
    <form-login />
    <http-basic />
</http>

5. Форма входа в систему

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

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

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

6. Авторизация с помощью ролей

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

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

7. Выход из системы

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

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

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

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

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

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

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.1. Аутентификация в памяти

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

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

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

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

Конечно, в обоих вышеприведенных примерах мы также необходимо определить bean-компонент PasswordEncoder, как описано в разделе 3.

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

@Autowired
private DataSource dataSource;

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

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

«

In this quick tutorial, we went over the basics of Java Configuration for Spring Security and focused on the code samples that illustrate the simplest configuration scenarios.