Выбор ответа Middle Spring Security обновлено

@PreAuthorize через this

Вопрос

Публичный метод export() без аннотаций вызывает в том же классе this.deleteAll(), помеченный @PreAuthorize("hasRole('ADMIN')"). Обычный пользователь вызвал export(). Что произойдёт?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: deleteAll выполнится без проверки: вызов мимо прокси. Методная безопасность построена на тех же AOP-прокси, что и транзакции.

Варианты ответа

  1. AccessDeniedException при вызове deleteAll
  2. Проверка выполнится при старте приложения
  3. Spring Security проверяет аннотации через байткод, поэтому сработает
  4. deleteAll выполнится без проверки: вызов мимо проксиправильный ответ

Разбор

Методная безопасность построена на тех же AOP-прокси, что и транзакции. Внутренний вызов через this не проходит через прокси, и проверка не выполняется: это уже уязвимость. Проверки прав ставят на точки входа (публичные методы, которые вызываются снаружи) или выносят защищённую операцию в отдельный бин.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.