我调查了与AbstractPreAuthenticatedProcessingFilter相关的Spring Security实现,我不得不承认我很困惑。让我们关注名为requiresAuthentication的方法,因为基于它返回的值将进行或不进行身份验证。
由于:
if (currentUser.getName().equals(principal)) {
return false;
}
当equals principal存储在SecurityContextHolder(本地线程)中时,永远不会执行身份验证。当出现这种情况时,这是非常有效的情况。接下来会发生什么?过滤器假定相同的主体(过去验证)不需要再次进行身份验证。如果在AuthenticationProvider中实现的逻辑是关键的,并且可分配的权限可能会随着时间的推移而快速变化,那该怎么办?
我知道通过实现任何类(因为principal被引用为Object)可以很容易地绕过这个“行为”,它不会覆盖Object的equals方法。不过,我想确定我会错过什么,因为从我目前的观点来看,这是一个很大的错误。如果我的怀疑是正确的,那么以下所有实现都可能导致安全问题:
X509AuthenticationFilter正常工作,因为两个不同的X509Certificate从不等于。
罗伯特