Для чего нужна @PreAuthorize в Spring Security?
- Как проверять права на уровне методов в Spring?
@PreAuthorize проверяет права перед вызовом метода выражением SpEL: роли, authorities, параметры метода и вызовы бинов — например, владение ресурсом. Включается @EnableMethodSecurity.
@PreAuthorize("hasRole('ADMIN') or #userId == authentication.name")- Работает через AOP-прокси — нет при self-invocation
- @PostAuthorize проверяет результат, @PostFilter фильтрует коллекцию
А ещё В Spring Security 6 — @EnableMethodSecurity вместо @EnableGlobalMethodSecurity
Подробно
Зачем: правила по 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 — аннотации молча не работают.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Для настройки JDBC pool
- ✗Для проверки прав после ответа клиенту
- ✓Для проверки прав перед вызовом метода
- ✗Для сериализации JSON
Что спросят дальше
- Как включить method security?
- Чем hasRole отличается от hasAuthority?
Разбор темы
- Аутентификация: JWT, OAuth2/OIDC и method security
Структура и валидация JWT, проблема отзыва, роли OAuth2 и authorization code flow, OIDC, и авторизация на уровне методов.
Связанные вопросы
- У пользователя есть authority "ROLE_ADMIN". Какое выражение в @PreAuthorize сработает? Middle
- Как в Spring Security устроены аутентификация и авторизация — какие объекты за них отвечают? Middle
- Эндпоинт GET /orders/{id} проверяет, что пользователь аутентифицирован, и возвращает заказ по идентификатору. Что здесь не так? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.