Как настраивать аутентификацию и авторизацию в Spring Security?

«Как настраивать аутентификацию и авторизацию в Spring Security?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring Security настраивается для управления аутентификацией (кто вы) и авторизацией (что вам разрешено). Основные подходы — конфигурация через Java-код (рекомендуется) или XML.

Ключевые настройки:

  1. Аутентификация: Настройка источника данных пользователей (in-memory, JDBC, LDAP) и механизма (форма, OAuth2, JWT).
  2. Авторизация: Ограничение доступа к URL и методам на основе ролей и прав.
  3. Защита от атак: Включение защиты от CSRF и настройка CORS.
  4. Кастомизация: Создание собственных страниц входа, обработчиков ошибок и фильтров.

Пример базовой конфигурации (Java Config):

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
            .logout()
                .permitAll()
            .and()
            .csrf().disable(); // Отключение CSRF для API (с осторожностью)
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER")
            .and()
            .withUser("admin").password("{noop}admin").roles("ADMIN");
    }
}

Почему так? Конфигурация в коде типобезопасна и проще для рефакторинга. Расширение WebSecurityConfigurerAdapter (до Spring Security 5.7) или использование компонента SecurityFilterChain (новый стиль) позволяет централизованно управлять всей безопасностью приложения.