JWT vs UserDetailsService
В Spring Security UserDetailsService используется для аутентификации по логину и паролю — фреймворк вызывает loadUserByUsername(), достаёт пользователя из БД и сравнивает пароли. Это актуально для form login и basic auth.
Почему при JWT не нужен UserDetailsService
При JWT-аутентификации проверка пароля не происходит на каждый запрос. Все данные (логин, роли) уже закодированы в самом токене. JWT-фильтр парсит токен, проверяет подпись и кладёт готовый объект Authentication в SecurityContext.
Поэтому реализовать свой JwtAuthentication, имплементирующий Authentication напрямую, — логичнее, чем тянуть UserDetailsService с лишним запросом в БД на каждый HTTP-запрос.
Когда UserDetailsService всё же нужен
UserDetailsService используется один раз — при выдаче токена (эндпоинт логина), чтобы проверить пароль пользователя. После этого вся аутентификация идёт через JWT без обращения к БД.
См. также
- AuthenticationEntryPoint в Spring Security — обработка ошибок аутентификации в filter chain