У меня есть простое приложение Spring Boot с Vaadin для пользовательского интерфейса и Spring Boot Security.
Я пытаюсь добиться простой навигации между компонентами от страницы входа в систему до основного вида.
это моя конфигурация безопасности:
@Override
protected void configure(HttpSecurity http) throws Exception {
// Not using Spring CSRF here to be able to use plain HTML for the login page
http.csrf().disable()
.authorizeRequests()
.requestMatchers(SecurityUtils::isFrameworkInternalRequest).permitAll()
.and().formLogin().loginPage(LOGIN_URL).permitAll().loginProcessingUrl(LOGIN_PROCESSING_URL)
.failureUrl(LOGIN_FAILURE_URL)
.successHandler(new SavedRequestAwareAuthenticationSuccessHandler())
.and().logout().logoutSuccessUrl(LOGOUT_SUCCESS_URL);
}
это мой LoginView:
@Route("login")
@UIScope
@SpringComponent
public class LoginView extends VerticalLayout {
/**
* AuthenticationManager is already exposed in WebSecurityConfig
*/
@Autowired
private AuthenticationManager authManager;
private LoginOverlay loginOverlay;
public LoginView() {
loginOverlay = new LoginOverlay();
loginOverlay.addLoginListener(this::authenticate);
loginOverlay.setOpened(true);
LoginI18n i18n = LoginI18n.createDefault();
i18n.setAdditionalInformation("Welcome");
loginOverlay.setI18n(i18n);
add(loginOverlay);
}
private void authenticate(AbstractLogin.LoginEvent e) {
try {
Authentication auth = authManager.authenticate(
new UsernamePasswordAuthenticationToken(e.getUsername(), e.getPassword()));
SecurityContext sc = SecurityContextHolder.getContext();
sc.setAuthentication(auth);
if (auth.isAuthenticated())
getUI().ifPresent(ui -> ui.navigate(MainView.class));
} catch (Exception ex) {
loginOverlay.setError(true);
}
}}
и MainView:
@Route("main")
public class MainView extends VerticalLayout implements AfterNavigationObserver {
private final CertView certView;
private final UserView userView;
public MainView(CertView certView, UserView userView) {
this.certView = certView;
this.userView = userView;
}
private void createMain() {
Tab tab1 = new Tab("Certificates");
Tab tab2 = new Tab("Users");
Tabs tabs = new Tabs(tab1, tab2);
certView.setVisible(true);
userView.setVisible(false);
Map<Tab, Component> tabsToPages = new HashMap<>();
tabsToPages.put(tab1, certView);
tabsToPages.put(tab2, userView);
Div pages = new Div(certView, userView);
pages.setSizeFull();
Set<Component> pagesShown = Stream.of(certView)
.collect(Collectors.toSet());
tabs.addSelectedChangeListener(event -> {
pagesShown.forEach(page -> page.setVisible(false));
pagesShown.clear();
Component selectedPage = tabsToPages.get(tabs.getSelectedTab());
selectedPage.setVisible(true);
pagesShown.add(selectedPage);
});
add(tabs, pages);
}
@Override
public void afterNavigation(AfterNavigationEvent afterNavigationEvent) {
createMain();
}
}
CertView
и UserView
- это @UIScope
d @SpringComponent
s, в которые введено некоторое количество DAO и которые получают данные и устанавливают свои компоненты прямо в своем конструкторе.
Теперь, что происходит, когда вызывается authenticate
и authManager.authenticate
представления входа в систему, это представление направляется в MainView, что я могу сказать, видя, что вызывается конструктор, URL-адрес изменяется, но ничто не обрабатывается. Странно, что , когда я устанавливаю точку останова на странице конструктора MainView, успешно отрисовывается.
Я совсем новичок в Vaadin и не знаю, как должна выглядеть правильная навигация, чтобы вы могли прокомментировать лучший способ сделать это, но на самом деле я хотел бы остаться настолько простым, насколько это возможно.
Так как мне правильно перемещаться или отображать содержимое mainView при правильном событии жизненного цикла?
Ваадин: 13.0.1