关于spring-security登录后重定向至拦截前访问的url的实现原理
来源:互联网 发布:黑马程序员全套视频 编辑:程序博客网 时间:2024/06/05 10:20
首先我们来看下我们整个流程图
这就是我自己摸索出来的关于整个访问拦截登录重定向的流程图 其中3,6,7步是对拦截前访问的request的处理
接下来是对以上几个步骤中关键代码的分析
1.
首先我们先了解下关于 FilterSecurityIntercepto所在的位置
我们看到他在最后一位从这个拦截器的下面代码:
// Attempt authorization try { this.accessDecisionManager .decide(authenticated , object , attributes ); } catch (AccessDeniedException accessDeniedException ) { publishEvent( new AuthorizationFailureEvent(object , attributes , authenticated, accessDeniedException )); throw accessDeniedException; }
2.
我们能够看出当其在身份的权限验证失败的情况下会抛出accessDeniedException异常,这个时候上一层的拦截器也就是倒数第二个拦截器ExceptionTranslationFilter捕获了该异常并进一步处理具体代码如下
private void handleSpringSecurityException(HttpServletRequest request, HttpServletResponse response , FilterChain chain, RuntimeException exception) throws IOException, ServletException { if (exception instanceof AuthenticationException) { logger.debug( "Authentication exception occurred; redirecting to authentication entry point", exception); sendStartAuthentication( request, response, chain, (AuthenticationException) exception ); } else if (exception instanceof AccessDeniedException ) { if (authenticationTrustResolver .isAnonymous(SecurityContextHolder.getContext().getAuthentication())) { logger.debug( "Access is denied (user is anonymous); redirecting to authentication entry point", exception); sendStartAuthentication( request, response, chain, new InsufficientAuthenticationException( "Full authentication is required to access this resource")); } else { logger.debug( "Access is denied (user is not anonymous); delegating to AccessDeniedHandler", exception); accessDeniedHandler.handle(request , response , (AccessDeniedException) exception); } } }
3.
进入sendStartAuthentication这个函数后我们看到了
protected void sendStartAuthentication(HttpServletRequest request, HttpServletResponse response , FilterChain chain, AuthenticationException reason) throws ServletException, IOException { // SEC-112: Clear the SecurityContextHolder's Authentication, as the // existing Authentication is no longer considered valid SecurityContextHolder. getContext().setAuthentication(null); requestCache.saveRequest(request , response ); logger.debug( "Calling Authentication entry point." ); authenticationEntryPoint.commence(request , response , reason ); }
这里就有requestCache.saveRequest(request,response);对对象进行保存的业务代码。这个是保存的key
staticfinalStringSAVED_REQUEST="SPRING_SECURITY_SAVED_REQUEST";
6.
登录请求验证完成之后 UsernamePasswordAuthenticationFilter会调用SavedRequestAwareAuthenticationSuccessHandler的实例loginsuccesshandler来处理登录成功后的处理步骤
publicvoidonAuthenticationSuccess(HttpServletRequestrequest, HttpServletResponseresponse,
Authenticationauthentication)throwsServletException, IOException {
SavedRequestsavedRequest = requestCache.getRequest(request,response);
if(savedRequest==null) {
super.onAuthenticationSuccess(request,response,authentication);
return;
}
StringtargetUrlParameter= getTargetUrlParameter();
if(isAlwaysUseDefaultTargetUrl() || (targetUrlParameter!=null&& StringUtils.hasText(request.getParameter(targetUrlParameter)))) {
requestCache.removeRequest(request,response);
super.onAuthenticationSuccess(request,response,authentication);
return;
}
clearAuthenticationAttributes(request);
// Use the DefaultSavedRequest URL
StringtargetUrl=savedRequest.getRedirectUrl();
logger.debug("Redirecting to DefaultSavedRequest Url: "+targetUrl);
getRedirectStrategy().sendRedirect(request,response,targetUrl);
}
我们在这里看到该方法从session中获取缓存的拦截前request对象,并进行除重定向之外无其他的操作7.
我们看到 RequestCacheAwareFilter在拦截器链中排第7位,它的作用就是获取session中的保存的request并对当前的request进行替换工作
public void doFilter(ServletRequest request , ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest wrappedSavedRequest = requestCache.getMatchingRequest((HttpServletRequest) request, (HttpServletResponse)response ); chain.doFilter( wrappedSavedRequest == null ? request : wrappedSavedRequest, response ); }
这个方法中很明显继续下面拦截处理的request已经不是之前的那个request的对象了而是被替换成了继承自HttpServletRequestWrapper的SavedRequestAwareWrapper。
这时我们已经清楚的发现新的request已经带上了我们被拦截前的request中保存的请求数据,而在登录步骤提交时并不存在这些数据。
1 0
- 关于spring-security登录后重定向至拦截前访问的url的实现原理
- 关于spring-security登录后重定向至拦截前访问的url的实现原理
- spring security插件--获取 登录前被拦截的URL
- [Spring Security 3.1] 关于拦截URL的配置
- spring mvc怎么加入权限控制,在未登录前,任何访问url都跳转到login页面;登录成功后跳转至先前的url
- spring 拦截器过滤登录url 不验证是否登录其他的都拦截验证是否登录才能访问url
- 获取重定向后的url
- 关于url重定向的问题
- 关于CAS服务端登录前ajax访问后台方法被拦截的配置-另外一种实现方式
- 安卓获取url重定向后的url
- 关于spring mvc重定向的两种实现方法
- 关于CAS服务端登录前ajax访问后台方法被拦截的配置
- Servlet的自我理解之4:URL重定向技术的原理与具体实现
- Spring Security Cyclic redirection(Spring Security 循环重定向的问题)
- CHttpFile 获取URL重定向后的文件名
- J2EE实现登录后自动跳转到登录前访问的页面
- Spring Security 的login(登录页)重构
- 关于使用iptables对url的重定向
- 微信测试号的URL和Token原理
- 在c的函数中调用oc的方法
- HDFS 解析
- jQuery拖放排序插件DDSort
- Android十大常用技术揭秘-挑战
- 关于spring-security登录后重定向至拦截前访问的url的实现原理
- 【HNOI2011】【BZOJ2336】任务调度
- Java ConcurrentModificationExcepton
- Gson的反射解析机制详解(2)
- 符合1-2年工作经验,开发中的难点及相关优化:
- OC内存管理
- 上一个博文开源的漫岛APP做了部分优化
- 学生面试被问到的问题总结
- python的一些问题以及处理思路