在Spring Security中,当涉及到身份验证时,会出现AuthenticationExeption
,我知道重定向等逻辑是通过AuthenticationEntryPoint
执行的。Authorization exception
抛出AccessDeniedException
,AccessDeniedHandler
处理它。
但是,这两个对象都是负责处理特定异常的逻辑的对象,所以我不知道为什么它们被创建为不同名称的对象,EntryPoint和Handler。继承EntryPoint时要重写的函数和继承Handler时要实现的函数甚至是相同的形式。
public interface AuthenticationEntryPoint {
void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
throws IOException, ServletException;
}
public interface AccessDeniedHandler {
void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException)
throws IOException, ServletException;
}
为什么Spring Security不使用一个名为handler的对象来处理异常,而是使用单独的Entrypoint对象?我很好奇这两者之间的区别。
2条答案
按热度按时间jmo0nnb31#
两种不同的名称用于两种不同的用例:
参见Spring Security参考:
安全异常处理
ExceptionTranslationFilter
允许将AccessDeniedException
和AuthenticationException
转换为HTTP响应。ExceptionTranslationFilter
作为安全过滤器之一插入FilterChainProxy。下图显示了
ExceptionTranslationFilter
与其他组件的关系:1.首先,
ExceptionTranslationFilter
调用FilterChain.doFilter(request, response)
来调用应用程序的其余部分。AuthenticationException
,则启动身份验证。HttpServletRequest
,以便在身份验证成功后可以使用它来重放原始请求。AuthenticationEntryPoint
用于从客户端请求凭据。例如,它可能重定向到登录页面或发送WWW-Authenticate
头。AccessDeniedException
,则拒绝访问。调用AccessDeniedHandler
来处理拒绝访问。如果应用程序没有抛出
AccessDeniedException
或AuthenticationException
,则ExceptionTranslationFilter
不会执行任何操作。hec6srdp2#
EntryPoint(
AuthenticationEntryPoint
)处理鉴权异常,Handler(AccessDeniedHandler
)处理授权异常。我认为这更多的是关于granularity of the interface的代码设计决定,作者决定有一个更细粒度的接口,这样它就更像SRP,因为身份验证和授权是完全不同的事情。