При заданной конфигурации вы получите два экземпляра BasicAuthenticationFilter
.И оба должны получить свой AuthenticationManager
просто отлично.Для одного из них, тем не менее, это родительский элемент AuthenticationManager
, что означает, что вы также должны проверить свойство authenticationManager.parent
в своем отладчике.
Ваш AuthenticationManager
, как, впрочем, может иметь парупроблемы.
Spring Security OAuth создаст две цепочки фильтров (а затем две BasicAuthenticationFilter
с, две AuthenticationManager
с);один для конечных точек OAuth, например /oauth/token
, а другой для всего остального.
Цепочка фильтров, созданная для конечных точек OAuth, принимает значение UserDetailsService
, указанное с помощью ClientDetailsServiceConfigurer
, и применяет его к указанному AuthenticationManager
..
Если я возьму вашу конфигурацию и вставлю ее в свою среду разработки, а затем сделаю:
curl --user clientapp:SECRET localhost:8080/oauth/token -dgrant_type=client_credentials
Тогда он вернется с токеном.
Однако эти клиенты не применяются к AuthenticationManager
для остальных запросов.Причина этого в том, что с серверами авторизации часто бывает два разных типа пользователей: клиенты и конечные пользователи.Клиенты должны использовать OAuth API, в то время как пользователям просто нужно использовать веб-приложение (логин и т. Д.).
Это означает, что если вы попробуете:
curl --user clientapp:SECRET localhost:8080
Это не сработает.Набор пользователей не был применен к этой цепочке фильтров.
Если у вас есть конечные точки, отличные от OAuth2, вам необходимо указать группу пользователей в UserDetailsService
.Без этого, когда вы попытаетесь поразить эти конечные точки с помощью basic, пользователи не смогут его искать.
Кроме того, по умолчанию AuthenticationManager
автоматически подберет ваш PasswordEncoder
.Таким образом, вместо вашего WebSecurityConfiguration#configure
метода вы можете сделать:
@Bean
public UserDetailsService userDetailsService() {
return new InMemoryUserDetailsService(User
.withUsername("user")
.password(passwordEncoder().encode("password"))
.role("USER")
.build());
}
(все еще можно настроить AuthenticationManager
, если вам нужно сделать что-то более сложное.)
Пробуя это с вашим опубликованным приложением (снова изменив метод configure
в WebSecurityConfiguration
для вышеупомянутого), я также могу сделать:
curl --user user:password localhost:8080