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-методах.