Spring Security中EntryPoint和handler的区别

avwztpqn  于 2023-05-29  发布在  Spring
关注(0)|答案(2)|浏览(262)

在Spring Security中,当涉及到身份验证时,会出现AuthenticationExeption,我知道重定向等逻辑是通过AuthenticationEntryPoint执行的。Authorization exception抛出AccessDeniedExceptionAccessDeniedHandler处理它。
但是,这两个对象都是负责处理特定异常的逻辑的对象,所以我不知道为什么它们被创建为不同名称的对象,EntryPointHandler。继承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对象?我很好奇这两者之间的区别。

jmo0nnb3

jmo0nnb31#

两种不同的名称用于两种不同的用例:

  • 入口点:如果您未登录(身份验证)
  • 拒绝访问:如果不允许您访问资源(授权)

参见Spring Security参考:

安全异常处理

ExceptionTranslationFilter允许将AccessDeniedExceptionAuthenticationException转换为HTTP响应。
ExceptionTranslationFilter作为安全过滤器之一插入FilterChainProxy。
下图显示了ExceptionTranslationFilter与其他组件的关系:

1.首先,ExceptionTranslationFilter调用FilterChain.doFilter(request, response)来调用应用程序的其余部分。

  • 如果用户未通过身份验证或者是AuthenticationException,则启动身份验证。
  • SecurityContextHolder已清除。
  • 保存HttpServletRequest,以便在身份验证成功后可以使用它来重放原始请求。
  • AuthenticationEntryPoint用于从客户端请求凭据。例如,它可能重定向到登录页面或发送WWW-Authenticate头。
  • 否则,如果是AccessDeniedException,则拒绝访问。调用AccessDeniedHandler来处理拒绝访问。

如果应用程序没有抛出AccessDeniedExceptionAuthenticationException,则ExceptionTranslationFilter不会执行任何操作。

hec6srdp

hec6srdp2#

EntryPointAuthenticationEntryPoint)处理鉴权异常,HandlerAccessDeniedHandler)处理授权异常。

我认为这更多的是关于granularity of the interface的代码设计决定,作者决定有一个更细粒度的接口,这样它就更像SRP,因为身份验证和授权是完全不同的事情。

相关问题