Вопрос в том, что у меня есть сервер аутентификации (весенняя защита) и сервер ресурсов. Ource Сервер ресурсов не может правильно получить основного пользователя.
Spring Boot Версия: 2.0.7
Версия Spring Cloud: Finchley.SR2
Во-первых, я иду, чтобы получить токен доступа от Auth-сервера, и это успех.
Затем я использую токен для публикации Resource-сервера, и контроллер Resource-сервера может получить принципал.
Однако принципалом является строка, а не объект UserDetails.
Конфигурация веб-безопасности сервера аутентификации выглядит следующим образом:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private MaliUserDetailsService maliUserDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.csrf().disable();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(maliUserDetailsService).passwordEncoder(passwordEncoder());
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
Auth Server UserDetailsService :
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException(username);
}
return user;
}
Resouce Server Controller :
@GetMapping("/test")
public String test(Authentication authentication) {
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
return "hello " + userDetails.getUsername();
}
Когда я отправляю сообщение на сервер ресурсов, возникает исключение:
java.lang.ClassCastException: class java.lang.String cannot be cast to class org.springframework.security.core.userdetails.UserDetails (java.lang.String is in module java.base of loader 'bootstrap'; org.springframework.security.core.userdetails.UserDetails is in unnamed module of loader 'app')
===============
Затем я попытался изменить код контроллера следующим образом:
@GetMapping("/test")
public String test(Authentication authentication) {
return "hello " + authentication.getPrincipal().toString();
}
Результат "привет администратор". (admin - мое имя пользователя)
Почему принципалом в контроллере является строка вместо объекта UserDetails? Как это решить.