JWT vs UserDetailsService

В Spring Security UserDetailsService используется для аутентификации по логину и паролю — фреймворк вызывает loadUserByUsername(), достаёт пользователя из БД и сравнивает пароли. Это актуально для form login и basic auth.

Почему при JWT не нужен UserDetailsService

При JWT-аутентификации проверка пароля не происходит на каждый запрос. Все данные (логин, роли) уже закодированы в самом токене. JWT-фильтр парсит токен, проверяет подпись и кладёт готовый объект Authentication в SecurityContext.

Поэтому реализовать свой JwtAuthentication, имплементирующий Authentication напрямую, — логичнее, чем тянуть UserDetailsService с лишним запросом в БД на каждый HTTP-запрос.

Когда UserDetailsService всё же нужен

UserDetailsService используется один раз — при выдаче токена (эндпоинт логина), чтобы проверить пароль пользователя. После этого вся аутентификация идёт через JWT без обращения к БД.

См. также