Я использую аутентификацию OAuth2 со своим собственным сервером авторизации и ресурсов в Spring Boot. Я хочу изменить некоторые поля в моем User implements UserDetails
(это мой Principal
) объект во время выполнения от имени того же пользователя или от имени другого пользователя (администратор / модератор). Например, user1
с id = 1 хочет изменить свою страну, поэтому он вызывает этот метод:
@PostMapping("/setMyCountry")
public void setMyCountry(@CurrentUser User user, @RequestParam String newCountry){
user.setCountry(newCountry);
userRepository.save(user);
}
Но когда я хочу проверить его страну, используя это:
@GetMapping("/getMyCountry")
public String getMyCountry(@CurrentUser User user){
return user.getCountry();
}
Iполучить ту же старую страну.
Аналогично, с изменениями от имени администратора:
@PostMapping("/setUserCountry")
public void setUserCountry(@CurrentUser Moderator moderator, @RequestParam String newCountry){
User user = userRepository.findById(1L).get();
user.setCountry(newCountry);
userRepository.save(user);
}
@GetMapping("/getUserCountry")
public String getUserCountry(@CurrentUser Moderator moderator){
User user = userRepository.findById(1L).get();
return user.getCountry();
}
Возвращает ту же страну. Но, конечно, БД показывает новое значение.
Я уже видел вопрос о подобных проблемах, но если я использую это в setMyCountry()
:
Authentication newAuth = new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(newAuth);
, то это все еще не 'т работа. Обратите внимание, что я использую свои собственные токены, провайдеры токенов и токен-грантеры, но они все возвращают UsernamePasswordAuthenticationToken
в конце.
Итак, как я могу изменить поле User
и обновить текущий участник безвыйти и войти?