我制作了一个经过验证的简单应用程序,它有一个缺陷,每当有人试图访问像#34; https://www.example.com/orders.spr"这样的安全链接时,它会将用户重定向到登录页面进行身份验证,但经过身份验证后,用户将被重定向到主页。如何使我的下一个应用程序如此健壮,以便用户在身份验证后保持相同的URL?我需要知道的是,如何在Spring安全性中捕获匿名用户,如何在身份验证后将用户重定向到同一页面,以及如何将会话超时增加到1小时,以便用户可以在时间限制内访问URL。任何示例,教程或代码都是适用的 提前谢谢。
答案 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;
}
}
登录后实现重定向逻辑的最常用方法是:
答案 2 :(得分:-1)
您可能有某种过滤器,用于检查用户是否经过身份验证并重定向到登录页面。获取该过滤器中的请求URL,并将其作为参数添加到登录页面。登录成功后,检查该参数,如果存在则重定向。否则重定向到主页。瞧
答案 3 :(得分:-1)
您可以将Cookie用于此目的。因此,基本上您的身份验证失败的页面可以将它们保存在cookie中,验证后您可以重定向到之前的URL。
除此之外,你也可以拥有它。