Отсутствует пользователь в SecurityContextHolder ⇐ JAVA

Программисты JAVA общаются здесь
Anonymous
Отсутствует пользователь в SecurityContextHolder

Сообщение Anonymous »

Я создал поле для входа пользователя, данные пользователя взяты из базы данных MySQL. Я попадаю в новое окно с именем /grid. В /grid у меня есть кнопка «Сохранить», которую я хочу использовать для сохранения некоторых данных в базе данных MySQL. Однако проблема в том, что когда я нажимаю кнопку «Сохранить», я теряю вошедшего в систему пользователя, а метод, вызываемый кнопкой, показывает пользователя как «анонимного».
В сеанса Vaadin я вижу, какой пользователь вошел в систему, но Spring теряет его. Может ли кто-нибудь мне помочь? Посоветуйте мне, чего мне может не хватать в моей конфигурации? Возможно, возникла проблема с многопоточностью, но как с ней эффективно справиться?
Вот логи консоли:
User successful logged in: fish1
Logged user: fish1
Username while button is pressing in /grid: fish1
User in SecurityContext in class EnterProductService: anonymousUser
User in VaadinSession in class EnterProductService: fish1

@Service public class EnterProductService {
@Autowired
private RestTemplate restTemplate;
public String urlForMapping = null;
public boolean enteredProductError = false;
public boolean reqOpenFoodFacts = false;
public boolean reqFoodDataCentral = false;
public String reqBarcode = null;
public MealType reqMealType = null;
public double reqGrams = 0;

private final Executor executor;

@Autowired
public EnterProductService(@Qualifier("taskExecutor") Executor executor) {
this.executor = new DelegatingSecurityContextExecutor(executor);
}

@PreAuthorize("hasRole('USER')")
@Transactional
public void onSaveButtonClicked(String searchProductField, String gramAmount, MealType mealType) {

SecurityContext securityContext = SecurityContextHolder.getContext();

VaadinSession currentSession = VaadinSession.getCurrent();
UI currentUI = UI.getCurrent();

executor.execute(() -> {
VaadinSession.setCurrent(currentSession);

try {
currentSession.lock();
currentUI.access(() -> {
SecurityContextHolder.setContext(securityContext);
System.out.println("User in SecurityContext in class EnterProductService: " + SecurityContextHolder.getContext().getAuthentication().getName());
System.out.println("User in VaadinSession in class EnterProductService: " + VaadinSession.getCurrent().getSession().getAttribute("username"));
if (searchProductField != null && mealType != null && gramAmount != null) {
if (isOnlyNumeric(searchProductField)) {
reqBarcode = searchProductField;
reqGrams = Double.parseDouble(gramAmount);
reqMealType = mealType;
urlForMapping = String.format("/openfoodfacts/%s/%s/%s", searchProductField, gramAmount, mealType.name());
reqOpenFoodFacts = true;
reqFoodDataCentral = false;
} else if (isOnlyLetters(searchProductField)) {
reqBarcode = searchProductField;
reqGrams = Double.parseDouble(gramAmount);
reqMealType = mealType;
urlForMapping = String.format("/fooddatacentral/%s/%s/%s", searchProductField, gramAmount, mealType.name());
reqFoodDataCentral = true;
reqOpenFoodFacts = false;
} else {
enteredProductError = true;
reqOpenFoodFacts = false;
reqFoodDataCentral = false;
}
}
});
} finally {

currentSession.unlock();

}

});
}
public void sendRequestToApi() {
String url = urlForMapping;
String response = restTemplate.getForObject("http://localhost:8080/product" + url, String.class);

}

public boolean isOnlyNumeric (String string){
return string.matches("\\d+");
}

public boolean isOnlyLetters (String string){
return string.matches("[a-zA-Z]+");
}
}

Вот мой класс, в котором пользователь в SecurityContext отсутствует:
Здесь я вызываю onSaveButtonClicked(), и пользователь все еще доступен:
saveButton.addClickListener(event -> {
System.out.println("Username while button is pressing in /grid " + username);
enterProductService.onSaveButtonClicked(
searchProductField.getValue(),
gramAmount.getValue(),
comboBox.getValue());
enterProductService.sendRequestToApi();

Я попытался обработать многопоточность, проверив активные сеансы, но, похоже, это не сработало.
Чего мне не хватает в моей конфигурации? Почему мой пользователь теряется в SecurityContext, но все еще доступен в VaadinSession?
@Configuration
@EnableWebSecurity
public class SecurityConfig extends VaadinWebSecurity {

private final UserService userService;

@Autowired
public SecurityConfig(@Lazy UserService userService) {
this.userService = userService;
}

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/login", "/user", "/VAADIN/**", "/UIDL/**", "/HEARTBEAT/**", "/resources/**", "/websocket-client.js").permitAll()
.requestMatchers("/grid").hasRole("USER")
.anyRequest().permitAll()
)
.formLogin(form -> form
.loginPage("/login")
.defaultSuccessUrl("/grid", true)
.permitAll()
)
.logout(logout -> logout
// .logoutUrl("/logout")
.logoutSuccessUrl("/login")
.permitAll()
)
.csrf(csrf -> csrf.disable());
return http.build();
}

@Bean
public AuthenticationManager authenticationManager(PasswordEncoder passwordEncoder) {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userService);
authenticationProvider.setPasswordEncoder(passwordEncoder);
return new ProviderManager(authenticationProvider);
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... textholder

Вернуться в «JAVA»