Как Spring Security/OAuth определяет AuthenticationPrincipal

У меня есть проект spring, который использует spring-oauth2 и spring-security для аутентификации с использованием поставщика аутентификации LDAP.

В контроллерах я могу получить доступ к UserDetails текущего принципала, используя аннотацию @AuthenticationPrincipal.

Однако, когда я попадаю в конечную точку с токеном client_credential, @AuthenticationPrincipal представляет собой String, который является идентификатором клиента OAuth. Я понимаю, что при аутентификации с помощью client_credentials нет понятия пользователя, но я хотел бы, чтобы мой Принципал был более богатым типом данных. Как Spring решает установить моего принципала как String и могу ли я переопределить это поведение?


person Lee Avital    schedule 30.07.2015    source источник


Ответы (1)


Из спецификаций Oauth2

Учетные данные клиента (или другие формы аутентификации клиента) могут использоваться в качестве предоставления авторизации, когда область авторизации ограничена защищенными ресурсами, находящимися под контролем клиента, или защищенными ресурсами, предварительно согласованными с сервером авторизации. Учетные данные клиента используются в качестве предоставления авторизации, как правило, когда клиент действует от своего имени (клиент также является владельцем ресурса) или запрашивает доступ к защищенным ресурсам на основе авторизации, предварительно согласованной с сервером авторизации.

поскольку клиент также может быть владельцем ресурса, поэтому Spring создаст аутентификацию на основе информации о вашем клиенте.

Я предполагаю, что у вас есть настройка org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter, которая используется для аутентификации клиента.

Вы можете создать свой собственный org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService или создать свой собственный org.springframework.security.authentication.AuthenticationProvider, чтобы переопределить способ создания объекта аутентификации, но я предпочитаю использовать org.springframework.security.oauth2.provider.token.TokenEnhancer для добавления дополнительной информации к сгенерированному токену.

person KSTN    schedule 07.08.2015