diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/LoginPage.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/LoginPage.java index 419797b..1b7648b 100644 --- a/control-panel/src/main/java/ru/dragonestia/picker/cp/page/LoginPage.java +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/page/LoginPage.java @@ -1,23 +1,32 @@ package ru.dragonestia.picker.cp.page; import com.vaadin.flow.component.Html; +import com.vaadin.flow.component.UI; import com.vaadin.flow.component.login.LoginForm; import com.vaadin.flow.component.login.LoginI18n; import com.vaadin.flow.component.orderedlayout.VerticalLayout; -import com.vaadin.flow.router.BeforeEnterEvent; -import com.vaadin.flow.router.BeforeEnterObserver; -import com.vaadin.flow.router.Route; -import com.vaadin.flow.server.auth.AnonymousAllowed; +import com.vaadin.flow.router.*; +import jakarta.annotation.security.PermitAll; import lombok.extern.log4j.Log4j2; +import ru.dragonestia.picker.cp.service.SecurityService; @Log4j2 -@AnonymousAllowed +@PermitAll @Route("/login") -public class LoginPage extends VerticalLayout implements BeforeEnterObserver { +public class LoginPage extends VerticalLayout implements BeforeEnterObserver, AfterNavigationObserver { private final LoginForm formLogin; + private final boolean authenticated; + + public LoginPage(SecurityService securityService) { + if (securityService.getAuthenticatedAccount() != null) { + formLogin = null; + authenticated = true; + return; + } + + authenticated = false; - public LoginPage() { setAlignItems(Alignment.CENTER); add(new Html("

RoomPicker!

")); @@ -47,4 +56,11 @@ public class LoginPage extends VerticalLayout implements BeforeEnterObserver { formLogin.setError(true); } } + + @Override + public void afterNavigation(AfterNavigationEvent afterNavigationEvent) { + if (!authenticated) return; + + getUI().ifPresent(ui -> ui.navigate("/nodes")); + } } diff --git a/control-panel/src/main/java/ru/dragonestia/picker/cp/service/SecurityService.java b/control-panel/src/main/java/ru/dragonestia/picker/cp/service/SecurityService.java new file mode 100644 index 0000000..39f04e0 --- /dev/null +++ b/control-panel/src/main/java/ru/dragonestia/picker/cp/service/SecurityService.java @@ -0,0 +1,28 @@ +package ru.dragonestia.picker.cp.service; + +import com.vaadin.flow.component.UI; +import com.vaadin.flow.server.VaadinServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; +import org.springframework.stereotype.Service; +import ru.dragonestia.picker.cp.model.Account; + +@Service +@RequiredArgsConstructor +public class SecurityService { + + public Account getAuthenticatedAccount() { + var context = SecurityContextHolder.getContext(); + if (context != null && context.getAuthentication().getPrincipal() instanceof Account account) { + return account; + } + return null; + } + + public void logout() { + UI.getCurrent().getPage().setLocation("/login"); + var logoutHandler = new SecurityContextLogoutHandler(); + logoutHandler.logout(VaadinServletRequest.getCurrent().getHttpServletRequest(), null, null); + } +}