Java 奇怪的抽象预验证处理筛选器假设

Java 奇怪的抽象预验证处理筛选器假设,java,spring,http,spring-security,Java,Spring,Http,Spring Security,我已经调查了与AbstractPreAuthenticatedProcessingFilter相关的Spring安全实现,我不得不承认我很困惑。让我们重点讨论名为RequireAuthentication的方法,因为基于它返回的值,将执行或不执行身份验证 由于: if (currentUser.getName().equals(principal)) { return false; } 当等于主体存储在SecurityContextHolder(线程本地)中时,将永远不会执行身份验证。当

我已经调查了与AbstractPreAuthenticatedProcessingFilter相关的Spring安全实现,我不得不承认我很困惑。让我们重点讨论名为RequireAuthentication的方法,因为基于它返回的值,将执行或不执行身份验证

由于:

if (currentUser.getName().equals(principal)) {
   return false;
}
当等于主体存储在SecurityContextHolder(线程本地)中时,将永远不会执行身份验证。当这种情况发生时,这是非常有效的场景。接下来会发生什么?筛选器假定相同的主体(在过去经过身份验证)不需要再次进行身份验证。如果AuthenticationProvider中实现的逻辑非常重要,并且可分配的权限可能会随着时间的推移而快速变化,该怎么办

我理解,通过实现任何不覆盖对象的equals方法的类(因为主体被引用为对象),可以轻松绕过这种“行为”。尽管如此,我还是想确定我错过了什么,因为从我目前的观点来看,这是一个相当大的错误。如果我的怀疑是正确的,那么以下所有实现都可能导致安全问题:

  • J2eePreAuthenticatedProcessingFilter
  • WebSpherePreAuthenticatedProcessingFilter
  • RequestHeaderAuthenticationFilter
X509AuthenticationFilter工作正常,因为两个不同的X509Certificate从不相等


罗伯特

它试图解决80%的案件,但这并不能满足所有人的要求。它基本上遵循框架的其他部分所做的(仅在主体更改上重新验证)。如果您需要对每个请求进行重新身份验证,请覆盖
doFilter
方法(注意
requireauthentication
是私有的,因此无法覆盖)。谢谢您的想法!我最担心的是,在公共基础设施(如Internet)中,可以使用“缓存”身份验证实现的实例来执行不带授权的操作。因此,使用默认实现可能会导致安全漏洞:(.即使我认为深入研究我们使用的框架是我们的责任,但这不是一个好情况(imho)。几天前我已经实现了自己的过滤器,所以基本上我遵循了你的建议:)。我并不真正理解你的观点。预认证基础结构的要点是认证是在外部执行的。对于正常使用,在当前会话中使用缓存的主体没有安全漏洞。没错,但授权不是基于最新(AuthenticationProvider的实现)数据分配的,而是从SecurityContextHolder加载的。这不是特定于预认证的。internet上几乎每一个基于会话的web应用程序都会在会话期间登录,不管会话的持续时间有多长,而不是对每个请求重新进行身份验证。