《Spring Security3》第六章第四部分翻译(异常处理)(转载)
理解和配置异常处理
?我们能够看到ExceptionTranslationFilter处理如下的场景:
异常类型
谁抛出以及原因
AuthenticationException
AuthenticationProvider,当提供的凭证不合法或用户失效、过期;
DaoAuthenticationProvider,当访问DAO数据存储时出错;
RememberMeServices,当remember me cookie被篡改;
各种特定的认证类(CAS、NTLM等)在用户特定的场景下。
AccessDeniedException
AccessDecisionManager,当配置的Voter投票拒绝访问——注意这可能在任何投票场景下
???????? 要记住的是,我们前面提到的ExceptionTranslationFilter是区分这两种类型异常的关键点,因为这关系到应用用户的请求和响应流程。
【注意过滤器链中在ExceptionTranslationFilter之前的那些过滤器。ExceptionTranslationFilter只会处理和响应过滤器链中在此之后的过滤器所抛出的异常。用户可能会感到迷惑,尤其是将自定义过滤器进行了不正确排序的时候,不明白为什么期望的行为与应用实际的异常处理不一致——在很多场景下,过滤器的顺序是原因所在。】
???????? 尽管内置的处理流程在大多数情况下是可预测且满足需要的,但有时候你会需要自定义异常处理,尤其是在引入基类异常的自定义子类时,这需要过滤器链的特殊处理。
AuthenticationEntryPoint的重要性
???????? AuthenticationEntryPoint(在ExceptionTranslationFilter我们看到它是工作流程中的一个辅助类)在处理未认证用户请求中很重要。当ExceptionTranslationFilter确定用户需要认证时,它请求AuthenticationEntryPoint以了解下一步要做什么。在基于form的认证中,o.s.s.web.authentication.LoginUrlAuthenticationEntryPoint负责将用户定向到登录form。
???????? 我们将会在后面的章节中看到AuthenticationEntryPoint被用在各种认证机制中,从而实现更个性化的行为——例如,在中心认证服务(CAS)单点登录中,AuthenticationEntryPoint要确保用户被定向到CAS门户进行认证。
???????? 在很多环境下,当实现SpringSecurity与第三方认证系统(独立于web应用)集成时,你需要实现自己的AuthenticationEntryPoint。