Gymterview
middle

Как работают аннотации @PreAuthorize и @Secured?

@PreAuthorize и @Secured обеспечивают авторизацию на уровне методов (method-level security). Требуют @EnableMethodSecurity для активации.

Аспект @PreAuthorize @Secured
SpEL Да Нет
Доступ к параметрам Да (#param) Нет
Комбинирование условий Да (and, or) Нет (только OR между ролями)
@PostAuthorize Да Нет
Гибкость Высокая Минимальная
Пример
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) { }

@PreAuthorize("hasRole('ADMIN') or #userId == authentication.principal.id")
public UserDto getUserProfile(Long userId) {
    // ADMIN видит любой профиль, пользователь -- только свой
}

@PreAuthorize("#request.amount <= 10000 or hasRole('ADMIN')")
public void transfer(TransferRequest request) { }

@Secured("ROLE_ADMIN") // проще, но без SpEL
public void deleteUser(Long id) { }

Получение текущего пользователя

Пример
@GetMapping("/me")
public UserDto getCurrentUser(@AuthenticationPrincipal UserDetails userDetails) {
    return userService.findByUsername(userDetails.getUsername());
}

На собеседовании: ключевое – @PreAuthorize гибче (SpEL, доступ к параметрам), @Secured проще. Частая ошибка – забыть @EnableMethodSecurity (аннотации будут проигнорированы) или использовать на private-методах.