Spring Boot Security и Vaadin страница навигации и рендеринга проблема - PullRequest
1 голос
/ 13 марта 2019

У меня есть простое приложение 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

...