如何在Spring Security中处理从authenticationSuccessHandler重定向到Angular

时间:2019-05-06 22:31:51

标签: angular spring spring-security angular-routing

我正在尝试实现记住我功能。问题在于Angular会以自己的方式进行路由,因此我无法从Spring应用程序重定向到Angular App的特定路径。我通过发送带有重定向消息的响应来解决此问题,然后Angular应用解析该消息并将其重定向到特定路径。效果很好,但是在配置安全性时,它的工作方式略有不同。

例如,当我尝试登录时,我覆盖了successHandler,因为默认情况下,Spring希望重定向到某些url,而Angular无法对其进行处理。

.and()
    .formLogin()
        .loginPage("/")
        .loginProcessingUrl("/login")
        .successHandler((request, response, authentication) -> {
            AuthenticatedUser user = new AuthenticatedUser(
                    authentication.getName(),
                    authentication.isAuthenticated()
            );
            log.info("Authenticated {}", user);
            response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
            response.getWriter().print(objectMapper.writeValueAsString(user));
        })
        .failureHandler((request, response, exception) -> {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Wrong username and/or password");
        })

这很好用,但是当涉及到 rememberMe authenticationSuccessHandler 时,它以不同的方式工作。代码看起来类似于登录成功的处理程序。

.and()
    .rememberMe()
        .authenticationSuccessHandler((request, response, authentication) -> {
        AuthenticatedUser user = new AuthenticatedUser(
                    authentication.getName(),
                    authentication.isAuthenticated()
            );
            log.info("Authenticated {}", user);
            response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
            response.getWriter().print(objectMapper.writeValueAsString(user));
            redirectStrategy.sendRedirect(request, response, "");
        }).key("test")

但是,当我以这种方式执行此操作并轻轻地关闭应用程序的选项卡并再次打开时,Spring会通过我的AuthenticatedUser为我提供json响应。

Response by Spring

我还尝试了在authenticationSuccessHandler中使用 RedirectStrategy 重定向到root的index.html,但它也不起作用。

redirectStrategy.sendRedirect(request, response, "index.html");
redirectStrategy.sendRedirect(request, response, "/");
redirectStrategy.sendRedirect(request, response, "");

我在Spring应用程序日志中看到我的RememberMe正常运行,但是我不知道如何正确重定向,该用户无需再次登录。

0 个答案:

没有答案