Ответ
Реализовывал различные механизмы аутентификации и авторизации в 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
- Резервные коды для восстановления