Получить доступ

Для чего нужна @PreAuthorize в Spring Security?

MiddleSpring SecuritySpring Boot >=3
Ещё спрашивают так:
  • Как проверять права на уровне методов в Spring?
Коротко

@PreAuthorize проверяет права перед вызовом метода выражением SpEL: роли, authorities, параметры метода и вызовы бинов — например, владение ресурсом. Включается @EnableMethodSecurity.

  • @PreAuthorize("hasRole('ADMIN') or #userId == authentication.name")
  • Работает через AOP-прокси — нет при self-invocation
  • @PostAuthorize проверяет результат, @PostFilter фильтрует коллекцию

А ещё В Spring Security 6 — @EnableMethodSecurity вместо @EnableGlobalMethodSecurity

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Зачем: правила по URL грубые; часто право зависит от данных — «менять заказ может владелец или менеджер». @PreAuthorize на методе сервиса проверяет это рядом с бизнес-операцией, независимо от того, откуда метод вызван (REST, очередь, планировщик).

Выражения SpEL:

  • hasRole('ADMIN'), hasAuthority('orders:write'), isAuthenticated();
  • параметры метода: #orderId, #request.ownerId;
  • текущий пользователь: authentication.name, principal;
  • бины: @orderSecurity.canEdit(#orderId, authentication) — сложная логика в отдельном бине.
@PreAuthorize("hasRole('MANAGER') or @orderSecurity.isOwner(#id, authentication)")
public Order update(long id, OrderPatch patch) { ... }

Включение: @EnableMethodSecurity (Spring Security 6; prePostEnabled по умолчанию true).

Ограничения: реализовано прокси — вызов изнутри того же класса проверку обходит; проверка «владения» через отдельный запрос к базе дублирует загрузку — иногда проще выборка с фильтром по владельцу. @PostAuthorize("returnObject.ownerId == authentication.name") проверяет уже загруженный результат.

Что хотят услышать

  • Назначение и пример выражения.
  • Параметры, бины, текущий пользователь в SpEL.
  • Включение и ограничения прокси.

Частые ошибки

  • Забыть @EnableMethodSecurity — аннотации молча не работают.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Для проверки прав перед вызовом метода
  • ✗Для создания Kafka topic
  • ✗Для настройки JDBC pool
  • ✗Для сериализации JSON

Что спросят дальше

  • Как включить method security?
  • Чем hasRole отличается от hasAuthority?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем