Spring Security возвращает String в качестве принципала вместо UserDetails на контроллере - PullRequest
0 голосов
/ 02 января 2019

Вопрос в том, что у меня есть сервер аутентификации (весенняя защита) и сервер ресурсов. 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')

enter image description here

=============== Затем я попытался изменить код контроллера следующим образом:

@GetMapping("/test")
public String test(Authentication authentication) {
    return "hello " + authentication.getPrincipal().toString();
}

Результат "привет администратор". (admin - мое имя пользователя) enter image description here

Почему принципалом в контроллере является строка вместо объекта UserDetails? Как это решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...