Я создаю 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();
}
}