spring-security(十九)核心Filter-ExceptionTranslationFilter

ExceptionTranslationFilter是Spring Security的重要过滤器,它处理FilterSecurityInterceptor抛出的异常,如AuthenticationException和AccessDeniedException。当遇到这些异常时,它会进行重定向或返回合适的HTTP响应。过滤器主要涉及AuthenticationEntryPoint、AccessDeniedHandler、RequestCache等组件,用于处理重新认证、访问拒绝等情况。在Spring Boot环境中,这个过滤器是通过Java Config机制追加到Servlet中,参与到请求拦截过程。
摘要由CSDN通过智能技术生成
前言:
在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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值