Какие механизмы аутентификации и авторизации вы реализовывали в Java-приложениях?

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

Ответ

Реализовывал различные механизмы аутентификации и авторизации в Java-приложениях:

1. JWT-аутентификация (Stateless)

// Генерация токена
String token = Jwts.builder()
    .setSubject(username)
    .claim("roles", roles)
    .setIssuedAt(new Date())
    .setExpiration(new Date(System.currentTimeMillis() + 3600000))
    .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
    .compact();

// Валидация в фильтре
public class JwtFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, 
                                   HttpServletResponse response, 
                                   FilterChain chain) {
        String token = extractToken(request);
        if (token != null && validateToken(token)) {
            UsernamePasswordAuthenticationToken auth = 
                new UsernamePasswordAuthenticationToken(user, null, authorities);
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
        chain.doFilter(request, response);
    }
}

2. OAuth2 с Spring Security

# application.yml
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: ${GOOGLE_CLIENT_ID}
            client-secret: ${GOOGLE_SECRET}
            scope: profile,email

3. Базовая аутентификация для микросервисов

@Configuration
@EnableWebSecurity
public class BasicAuthConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
            .httpBasic(withDefaults())
            .csrf().disable();
        return http.build();
    }
}

4. Ролевая модель и безопасность

  • Хеширование паролей: BCrypt с солью
  • Защита от атак: CSRF-токены, CORS-политики, заголовки безопасности
  • Хранение сессий: Redis для распределенных приложений
  • Авторизация: аннотации @PreAuthorize, @PostAuthorize

5. Двухфакторная аутентификация (2FA)

  • Генерация TOTP-кодов через Google Authenticator
  • Отправка кодов по SMS/email
  • Резервные коды для восстановления