Как обновить данные об основном объекте в Spring Boot - PullRequest
0 голосов
/ 31 января 2020

Я создаю REST API с помощью Spring Boot и OAuth2, и при попытке обновить объект Principal в сеансе у меня возникают проблемы. Я должен сделать это при обновлении пользователя, потому что некоторые отношения с базой данных могут измениться, и я думаю, что это не очень хорошая возможность проверять пользователя в базе данных на предмет получения значений по каждому запросу.

Я прочитал много сообщения о том, что решение - это только добавление нового контекста в SecurityContextHolder , например:

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

    CustomUserDetails u = (CustomUserDetails)authentication.getPrincipal();
    //Change here some details from user and update the database

    SecurityContextHolder.getContext().setAuthentication(authentication);

Но в моем случае это не сработает, если Я делаю запрос с тем же маркером доступа, объект Principal всегда возвращает старые значения.

--- EDIT ---

Мой класс конфигурации безопасности:

@Configuration
@EnableWebSecurity

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


   @Autowired
   private CustomUserDetailsService customUserDetailsService;

   @Autowired
   public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {

       auth.userDetailsService(customUserDetailsService);
   }

   @Override
   @Bean
   public AuthenticationManager authenticationManagerBean() throws Exception {

       return super.authenticationManagerBean();
   }
}

И мой класс CustomUserDetailService:

@Service
public class CustomUserDetailsService implements UserDetailsService {


   @Resource
   public MyUserRepository usersRepository;

   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

       Optional<AppUser> usersOptional = usersRepository.findByEmail(username);

       usersOptional.
           orElseThrow(() -> new UsernameNotFoundException(username));

       return usersOptional
               .map(CustomUserDetails::new)
               .get();
   }
}

1 Ответ

0 голосов
/ 06 февраля 2020

Ладно, наконец, я решил, как сказал @ r4phG, истечь текущий токен и использовать refre sh токен, чтобы получить новый токен, заставив получить обновленного пользователя.

...