前言:
在spring的安全过滤器链中ExceptionTranslationFilter在FilterSecurityInterceptor的前面,这个过滤器自身并不执行具体的安全防护,他主要处理FilterSecurityInterceptor这个过滤器抛出的各种异常,并返回给客户端一个合适的http响应。
一、ExceptionTranslationFilter功能和属性
1.在类中主要有以下几个属性
[list]
[*]AuthenticationEntryPoint-处理需要重新认证的逻辑
[*]AccessDeniedHandler-处理请求被拒绝的逻辑
[*]AuthenticationTrustResolver-判断处理类型
[*]RequestCache-缓存客户端请求,当认证完成后能继续执行引发认证的原始请求
[/list]
2.这个过滤器的主要逻辑在handleSpringSecurityException方法中,步骤如下
[list]
[*]如果捕获到的异常是AuthenticationException,就重新执行认证
[*]如果捕获到的异常是AccessDeniedException,再进一步执行下面的判断
■ 如果当前的认证形式是Anonymous或者RememberMe,则重新执行认证
■ 否则就是当前认证用户没有权限访问被请求资源,调用accessDeniedHandler.handle方法
[/list]
下面看下重新认证的方法sendStartAuthentication
首先会将现在SecurityContextHolder中的认证对象清除,之后将当前的调用保存在requestCache中,以便后面认证成功后能继续进行当前的处理,接着就调用authenticationEntryPoint的commence方法,将用户重定向到认证界面,提示用户进行认证。
3. AuthenticationEntryPoint类
这个类的主要作用是呈现给用户一个合适的响应从而提示用户能够重新登录,常见的实现类有
[list]
[*]BasicAuthenticationEntryPoint-基本认证对应的EntryPoint,修改Response的header,返回用户一个401码
[*]CasAuthenticationEntryPoint-cas认证对应的EntryPoint,将用户重定向到Cas服务器的登录页面
[*]LoginUrlAuthenticationEntryPoint-form login认证对应的EntryPoint,重定向到登录页面
[*]DelegatingAuthenticationEntryPoint-当系统中有多个EntryPoint,每个EntryPoint对应各自的匹配路径时采用这个EntryPoint。这个类维护一个RequestMatcher和EntryPoint对应关系的hash表,根据传入的request找到匹配的EntryPoint执行对应的commence方法,这个类里面还有一个defaultEntryPoint,当所有的EntryPoint都不匹配当前请求时调用默认EntryPoint的commence方法。
[/list]
下面以LoginUrlAuthenticationEntr
在spring的安全过滤器链中ExceptionTranslationFilter在FilterSecurityInterceptor的前面,这个过滤器自身并不执行具体的安全防护,他主要处理FilterSecurityInterceptor这个过滤器抛出的各种异常,并返回给客户端一个合适的http响应。
一、ExceptionTranslationFilter功能和属性
1.在类中主要有以下几个属性
[list]
[*]AuthenticationEntryPoint-处理需要重新认证的逻辑
[*]AccessDeniedHandler-处理请求被拒绝的逻辑
[*]AuthenticationTrustResolver-判断处理类型
[*]RequestCache-缓存客户端请求,当认证完成后能继续执行引发认证的原始请求
[/list]
2.这个过滤器的主要逻辑在handleSpringSecurityException方法中,步骤如下
[list]
[*]如果捕获到的异常是AuthenticationException,就重新执行认证
[*]如果捕获到的异常是AccessDeniedException,再进一步执行下面的判断
■ 如果当前的认证形式是Anonymous或者RememberMe,则重新执行认证
■ 否则就是当前认证用户没有权限访问被请求资源,调用accessDeniedHandler.handle方法
[/list]
下面看下重新认证的方法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);
}
首先会将现在SecurityContextHolder中的认证对象清除,之后将当前的调用保存在requestCache中,以便后面认证成功后能继续进行当前的处理,接着就调用authenticationEntryPoint的commence方法,将用户重定向到认证界面,提示用户进行认证。
3. AuthenticationEntryPoint类
这个类的主要作用是呈现给用户一个合适的响应从而提示用户能够重新登录,常见的实现类有
[list]
[*]BasicAuthenticationEntryPoint-基本认证对应的EntryPoint,修改Response的header,返回用户一个401码
[*]CasAuthenticationEntryPoint-cas认证对应的EntryPoint,将用户重定向到Cas服务器的登录页面
[*]LoginUrlAuthenticationEntryPoint-form login认证对应的EntryPoint,重定向到登录页面
[*]DelegatingAuthenticationEntryPoint-当系统中有多个EntryPoint,每个EntryPoint对应各自的匹配路径时采用这个EntryPoint。这个类维护一个RequestMatcher和EntryPoint对应关系的hash表,根据传入的request找到匹配的EntryPoint执行对应的commence方法,这个类里面还有一个defaultEntryPoint,当所有的EntryPoint都不匹配当前请求时调用默认EntryPoint的commence方法。
[/list]
下面以LoginUrlAuthenticationEntr