Как распределялась задача по реализации фильтра в Spring Security между вами и командой
Что проверяют
Вопрос двойной: какой была ваша личная часть работы и понимаете ли вы, как фильтр встраивается в цепочку Spring Security. Следом обычно просят показать, где именно фильтр стоял в цепочке и как его тестировали.
Как отвечать
Стройте ответ вокруг своего реального вклада, а не вокруг «мы сделали»:
- задача: зачем понадобился фильтр. Например, проверка JWT от внешнего провайдера, API-ключи для межсервисных вызовов, заголовок с идентификатором арендатора;
- разделение: кто писал сам фильтр, кто конфигурацию, кто тесты и ревью. Назовите, что сделали лично вы;
- техника: фильтр наследовал
OncePerRequestFilter, вdoFilterInternalпроверял данные запроса и при успехе клалAuthenticationвSecurityContextHolder. В цепочку его ставили черезhttp.addFilterBefore(..., UsernamePasswordAuthenticationFilter.class)в бинеSecurityFilterChain, публичные пути исключались черезshouldNotFilter; - согласование: как договаривались о контракте, формате ответов 401 и 403, порядке фильтров, если параллельно кто-то менял конфигурацию;
- проверка: тесты на
MockMvcсоspring-security-test, сценарии без токена, с просроченным токеном, с недостаточными правами; - итог: что заработало, сколько заняло, что бы вы сделали иначе.
Цифры и детали нужны свои. Если фильтр вы писали в одиночку, так и скажите и расскажите, с кем согласовывали решения. Если опыта не было вовсе, честно признайте это и опишите, как разделили бы работу и где видите риски: это лучше выдуманной истории, которая развалится на втором уточнении.
Где спотыкаются
Говорят только «мы». Интервьюер так и не понимает, что умеет сам кандидат, и начинает копать.
Показывают устаревшее знание: наследование от WebSecurityConfigurerAdapter, которого в Spring Security 6 уже нет. Конфигурацию сейчас описывают бинами SecurityFilterChain.
Помечают фильтр аннотацией @Component и не знают последствий. Spring Boot зарегистрирует его ещё и как обычный сервлетный фильтр, вне цепочки безопасности и не в том месте, где он задумывался. Нужен FilterRegistrationBean с setEnabled(false) или отказ от бина.