В чем разница между DefaultOAuth2AuthorizedClientManager и AuthorizedClientServiceOAuth2AuthorizedClientManager

#spring-boot #spring-security #spring-security-oauth2

Вопрос:

Просматривая документацию, я нашел только одну рекомендацию:

Defaultauth2authorizedclientmanager предназначен для использования в контексте запроса HttpServletRequest. При работе вне контекста HttpServletRequest вместо этого используйте AuthorizedClientServiceOAuth2AuthorizedClientManager.

Я мог бы проверить, что WebClient вызовы зависают, используя DefaultOAuth2AuthorizedClientManager вне области запроса сервлета, однако ничего странного не происходит, если я использую AuthorizedClientServiceOAuth2AuthorizedClientManager внутри контекста запроса сервлета. Тогда в чем же разница между ними двумя?

Ответ №1:

Основное отличие, как вы отметили в документах, заключается в том, где они будут использоваться. Это может быть менее очевидно со стороны, но будет более очевидно внутри структуры. Но, возможно, более простой способ объяснить, почему они отличаются, — это посмотреть, что они заключают в себе.

  • DefaultOAuth2AuthorizedClientManager использует OAuth2AuthorizedClientRepository
    • который имеет сигнатуру метода loadAuthorizedClient(String clientRegistrationId, Authentication principal, HttpServletRequest request)
  • AuthorizedClientServiceOAuth2AuthorizedClientManager использует OAuth2AuthorizedClientService
    • который имеет сигнатуру метода loadAuthorizedClient(String clientRegistrationId, String principalName)

Так DefaultOAuth2AuthorizedClientManager что, я думаю, вы бы назвали «на основе запросов» и AuthorizedClientServiceOAuth2AuthorizedClientManager «на основе услуг», что на самом деле означает все остальное.

Документы API будут полезны здесь:

Обновить:

Какова была бы дополнительная ценность использования запроса в качестве параметра?

В качестве интерфейса объявление о том, что loadAuthorizedClient метод принимает запрос в качестве параметра, означает, что любая будущая реализация может использовать запрос, чтобы повлиять на его решение. Реализация по умолчанию ( DefaultOAuth2AuthorizedClientManager ) делает это, так HttpSessionOAuth2AuthorizedClientRepository как использует запрос на доступ к сеансу.

Комментарии:

1. Спасибо за объяснение, Стив, но я все еще не уверен, что понимаю разницу. Какова была бы дополнительная ценность использования запроса в качестве параметра?

2. В качестве интерфейса объявление о том, что loadAuthorizedClient метод принимает запрос в качестве параметра, означает, что любая будущая реализация может использовать запрос, чтобы повлиять на его решение. Реализация по умолчанию делает это, так HttpSessionOAuth2AuthorizedClientRepository как использует запрос на доступ к сеансу.