diff --git a/src/main/java/org/example/untitled/config/SecurityConfig.java b/src/main/java/org/example/untitled/config/SecurityConfig.java index dcab62e..e01df28 100644 --- a/src/main/java/org/example/untitled/config/SecurityConfig.java +++ b/src/main/java/org/example/untitled/config/SecurityConfig.java @@ -1,6 +1,6 @@ package org.example.untitled.config; -import org.example.untitled.user.Role; +import org.example.untitled.security.CustomAuthenticationSuccessHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; @@ -16,8 +16,6 @@ import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; -import java.util.Optional; - @Configuration @EnableWebSecurity @EnableMethodSecurity @@ -67,21 +65,7 @@ public AuthenticationManager authenticationManager(AuthenticationConfiguration c @Bean public AuthenticationSuccessHandler customAuthenticationSuccessHandler() { - return (request, response, authentication) -> { - Role role = authentication.getAuthorities().stream() - .map(a -> Role.fromAuthority(a.getAuthority())) - .flatMap(Optional::stream) - .findFirst() - .orElse(Role.USER); - - if (role == Role.ADMIN) { - response.sendRedirect("/admin"); - } else if (role == Role.HANDLER || role == Role.SUPERVISOR) { - response.sendRedirect("/handler"); - } else { - response.sendRedirect("/user"); - } - }; + return new CustomAuthenticationSuccessHandler(); } @Bean diff --git a/src/main/java/org/example/untitled/security/CustomAuthenticationSuccessHandler.java b/src/main/java/org/example/untitled/security/CustomAuthenticationSuccessHandler.java new file mode 100644 index 0000000..fc5c2dc --- /dev/null +++ b/src/main/java/org/example/untitled/security/CustomAuthenticationSuccessHandler.java @@ -0,0 +1,43 @@ +package org.example.untitled.security; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.example.untitled.user.Role; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.security.web.savedrequest.HttpSessionRequestCache; +import org.springframework.security.web.savedrequest.SavedRequest; + +import java.io.IOException; +import java.util.Optional; + +public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { + + private final HttpSessionRequestCache requestCache = new HttpSessionRequestCache(); + + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, + Authentication authentication) throws IOException, ServletException { + SavedRequest savedRequest = requestCache.getRequest(request, response); + if (savedRequest != null) { + super.onAuthenticationSuccess(request, response, authentication); + return; + } + + Role role = authentication.getAuthorities().stream() + .map(a -> Role.fromAuthority(a.getAuthority())) + .flatMap(Optional::stream) + .findFirst() + .orElse(Role.USER); + + String targetUrl = switch (role) { + case ADMIN -> "/admin"; + case HANDLER, SUPERVISOR -> "/handler"; + default -> "/user"; + }; + + clearAuthenticationAttributes(request); + getRedirectStrategy().sendRedirect(request, response, targetUrl); + } +} \ No newline at end of file diff --git a/src/main/resources/static/js/script.js b/src/main/resources/static/js/script.js index ac3bee0..201c30d 100644 --- a/src/main/resources/static/js/script.js +++ b/src/main/resources/static/js/script.js @@ -81,15 +81,17 @@ async function uploadNewFile(){ async function deleteFile(fileName){ const status = document.getElementById('status'); - if (!window.confirm(fileName + " will be deleted! Are you sure?")) { + if (window.confirm(fileName + " will be deleted! Are you sure?")) { const res = await apiReq(`/tickets/upload/api/files/delete-url?fileName=${encodeURIComponent(fileName)}`, {method: 'DELETE'}); - if(res.ok){ + if (!res) return; + if (res.ok) { await fetchAFile(); } else { status.innerText= 'Error: ' + res.status; } } } + async function apiReq(url, options = {}) { options.credentials = options.credentials || 'same-origin'; options.headers = options.headers || {};