创建一个spring mvc应用程序,在验证后将每个请求重定向回以前的URL

时间:2018-05-04 14:46:28

标签: java spring spring-mvc spring-security

我制作了一个经过验证的简单应用程序,它有一个缺陷,每当有人试图访问像#34; https://www.example.com/orders.spr"这样的安全链接时,它会将用户重定向到登录页面进行身份验证,但经过身份验证后,用户将被重定向到主页。如何使我的下一个应用程序如此健壮,以便用户在身份验证后保持相同的URL?我需要知道的是,如何在Spring安全性中捕获匿名用户,如何在身份验证后将用户重定向到同一页面,以及如何将会话超时增加到1小时,以便用户可以在时间限制内访问URL。任何示例,教程或代码都是适用的 提前谢谢。

4 个答案:

答案 0 :(得分:0)

您可以使用 SavedRequestAwareAuthenticationSuccessHandler 作为身份验证成功处理程序来执行此操作。

在api doc页面中,我们可以找到以下描述:

  

可以使用的身份验证成功策略   DefaultSavedRequest可能已经存储在会话中   的ExceptionTranslationFilter。当这样的请求被截获时   要求认证,请求数据存储记录   在认证过程开始之前的原始目的地,和   允许在重定向到同一个请求时重建请求   发生URL。此类负责执行重定向   如果合适,原始网址。

关键点是存储请求数据以在身份验证过程开始之前记录原始目标,并允许在重定向到同一URL时重建请求。

我在我的项目中使用了这个成功,你可以尝试一下,使用它,你需要扩展它,如下所示:

public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler{

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,HttpServletResponse response, Authentication authentication)
                throws IOException, ServletException {
            //...other code

            super.onAuthenticationSuccess(request, response, authentication);

        }

}

答案 1 :(得分:0)

Spring Security提供了一个组件,它直接负责在成功验证后决定要做什么 - AuthenticationSuccessHandler:

也许在代码之下可以帮助您理解任务流程:

 public class MySimpleUrlAuthenticationSuccessHandler
  implements AuthenticationSuccessHandler {
  
    protected Log logger = LogFactory.getLog(this.getClass());
 
    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
 
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication)
      throws IOException {
  
        handle(request, response, authentication);
        clearAuthenticationAttributes(request);
    }
 
    protected void handle(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication)
      throws IOException {
  
        String targetUrl = determineTargetUrl(authentication);
 
        if (response.isCommitted()) {
            logger.debug(
              "Response has already been committed. Unable to redirect to "
              + targetUrl);
            return;
        }
 
        redirectStrategy.sendRedirect(request, response, targetUrl);
    }
 
    protected String determineTargetUrl(Authentication authentication) {
        boolean isUser = false;
        boolean isAdmin = false;
        Collection<? extends GrantedAuthority> authorities
         = authentication.getAuthorities();
        for (GrantedAuthority grantedAuthority : authorities) {
            if (grantedAuthority.getAuthority().equals("ROLE_USER")) {
                isUser = true;
                break;
            } else if (grantedAuthority.getAuthority().equals("ROLE_ADMIN")) {
                isAdmin = true;
                break;
            }
        }
 
        if (isUser) {
            return "/homepage.html";
        } else if (isAdmin) {
            return "/console.html";
        } else {
            throw new IllegalStateException();
        }
    }
 
    protected void clearAuthenticationAttributes(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session == null) {
            return;
        }
        session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
    }
 
    public void setRedirectStrategy(RedirectStrategy redirectStrategy) {
        this.redirectStrategy = redirectStrategy;
    }
    protected RedirectStrategy getRedirectStrategy() {
        return redirectStrategy;
    }
}

登录后实现重定向逻辑的最常用方法是:

  • 使用HTTP Referer标题

  • 在会话中保存原始请求

  • 将原始网址附加到重定向的登录网址

    thisthis文章中,您可以看到有关弹簧安全性的更多详细信息:

答案 2 :(得分:-1)

您可能有某种过滤器,用于检查用户是否经过身份验证并重定向到登录页面。获取该过滤器中的请求URL,并将其作为参数添加到登录页面。登录成功后,检查该参数,如果存在则重定向。否则重定向到主页。瞧

答案 3 :(得分:-1)

您可以将Cookie用于此目的。因此,基本上您的身份验证失败的页面可以将它们保存在cookie中,验证后您可以重定向到之前的URL。

除此之外,你也可以拥有它。

http://www.baeldung.com/spring_redirect_after_login