Используете ли вы Spring Security в чистом виде или в комбинации с другими решениями для аутентификации?

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

Ответ

На практике Spring Security редко используется в абсолютно "чистом" виде. Обычно он выступает ядром, которое интегрируется или расширяется сторонними решениями для конкретных требований.

Типичные комбинации:

Компонент Роль Интеграция с Spring Security
OAuth 2.0 / OIDC провайдер (Keycloak, Okta, Auth0) Внешний Identity Provider (IdP) Через spring-security-oauth2-client и spring-security-oauth2-resource-server. Приложение становится Relying Party.
JWT (JSON Web Tokens) Формат токена для stateless-аутентификации Через кастомный JwtAuthenticationFilter или встроенную поддержку OAuth 2.0 Resource Server.
LDAP / Active Directory Корпоративный каталог пользователей Через LdapAuthenticationProvider.
Кастомные системы Унаследованные (legacy) системы аутентификации Путем реализации собственного AuthenticationProvider.

Пример конфигурации для OAuth 2.0 Resource Server (JWT):

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authz -> authz
                .requestMatchers("/api/public/**").permitAll()
                .anyRequest().authenticated()
            )
            .oauth2ResourceServer(oauth2 -> oauth2
                .jwt(Customizer.withDefaults()) // Валидация JWT через jwks_uri провайдера
            );
        return http.build();
    }
}

Вывод: Spring Security — это гибкий фреймворк. Его сила — в способности выступать адаптером между вашим приложением и разнообразными системами аутентификации и авторизации, а не в замене их всех.