Я разрабатываю приложение, которое позволяет аутентифицированному пользователю создавать токены носителя OAuth2 для использования с API, опубликованными организацией. Идея состоит в том, чтобы позволить пользователю самостоятельно генерировать / отзывать такие токены, аналогично персональным токенам GitHub Personal API . Затем пользователь может использовать выданные токены для получения программного доступа к защищенным ресурсам. В этой конфигурации OAuth «Клиент», «Сервер авторизации» и «Сервер ресурсов» принадлежат организации. На данный момент все эти сервисы находятся в одном и том же процессе.
С этой целью я пытаюсь поддерживать тип Предоставление пароля для владельца ресурса . Среда реализации состоит из следующего:
Одно ограничение, которое имеет реализация, заключается в том, что он не имеет доступа к сохраненный пароль. Эта обработка делегируется внутренней веб-службе, которая выполняет фактическую аутентификацию.
Из-за ограничения, связанного с отсутствием доступа к сохраненному паролю, сконфигурированный по умолчанию DaoAuthenticationProvider
не может использоваться, так как он требует доступа к паролю, предоставленному объектом UserDetails
, возвращаемым провайдером. UserDetailsService
.
Я предполагаю, что мне нужно будет заменить это AuthenticationProvider
пользовательской реализацией. Тем не менее, все попытки сделать это, похоже, не вступают в силу.
Кажется, что следующее правильно регистрируется в ссылке parent
AuthenticationManager
, но не делегируется во время выполнения (из-за приоритета DaoAuthenticationProvider
):
@Configuration
public class SecurityConfig extends GlobalAuthenticationConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(new AuthenticationProvider() {
@Override
public boolean supports(Class> authentication) {
// For testing this is easier, but should check for UsernamePasswordAuthentication.class
return true;
}
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
// Perform custom logic...
return authentication;
}
});
}
}
Кажется, нет Что бы я ни пытался (см. ссылки ниже), я всегда получаю следующих двух провайдеров в ProviderManager
, когда BasicAuthenticationFilter
вызывает Authentication authResult = authenticationManager.authenticate(authRequest)
в его методе doFilter
:
[
org.springframework.security.authentication.AnonymousAuthenticationProvider@366815e4,
org.springframework.security.authentication.dao.DaoAuthenticationProvider@5da3e311
]
Я считаю, что это может быть следствием метода AuthorizationServerSecurityConfigurer
clientCredentialsTokenEndpointFilter
. Однако этот класс помечен как final
и поэтому не может быть настроен.
Любые предложения или указатели будут с благодарностью.
Вещи, которые я пробовал / исследовал: