Во-первых, у вас есть два похожих метода, которые изменяют AuthenticationManagerBuilder
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
и
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
Есть ли причина, по которой они оба существуют?У меня нет этого в моей конфигурации.
Кроме того, ваш запрос может работать некорректно.Вы должны следовать некоторым рекомендациям о том, как настроить службу пользователя для обработки вызова loaduserbyusername и объекта auth
с одним из них.Как примечание: у меня не настроен тот же AuthenticationManagerBuilder
, что и у вас, У меня есть настроенный для использования службы userdetails, наряду с паролем Encoder , например, так.
auth.userDetailsService(securityUserService)
.passwordEncoder(passwordEncoders.userPasswordEncoder());
Если это не помогает, вот альтернативный способ настройки:
Измените класс, который расширяет WebSecurityConfigurerAdapter
на , только для конечной точки токена.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/oauth/**").permitAll()
.and()
.csrf()
.disable();
}
Теперь у вас в ResourceServerConfigurerAdapter
есть проблемы с настройками на сервере ресурсов.Обратите внимание, это будет работать, только если ваша конфигурация AuthenticationManagerBuilder
правильно загружает роль.Как уже отмечалось, Spring имеет префикс ROLE_
.Которые по какой-то причине вы извлекаете с помощью запроса, и они являются авторитетными.
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.requestMatchers()
.antMatchers("/api/**")
.and()
.authorizeRequests()
.antMatchers("/api/**").access("hasRole('USER')")
.and()
.exceptionHandling()
.accessDeniedHandler(new OAuth2AccessDeniedHandler());
}
В моем файле AuthServerConfig
нет следующих аннотаций:
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Import(SecurityConfiguration.class)
Iсконфигурируйте AuthorizationServerSecurityConfigurer
иначе, чем учебник, которым вы следовали, у меня следующее:
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
}
Мой ClientDetailsServiceConfigurer
все еще находится в памяти, так что это также отличается.Мой AuthorizationServerEndpointsConfigurer
тоже немного отличается, я только добавляю токен-магазин, цепочку энхансеров (не беспокойтесь об этом, это дополнительно) и authenticationManager
endpoints
.tokenStore(tokenStore())
.tokenEnhancer(tokenEnhancerChain)
.authenticationManager(authenticationManager);