为什么我必须设置 AuthenticationManager 两次

Why do I have to set AuthenticationManager twice

在我的应用程序中,我实现了 X.509 身份验证

我创建了以下名为 X509AuthenticationFilter 的 class 扩展 AbstractPreAuthenticatedProcessingFilter 默认由 spring 安全提供。

我将自己的 AuthenticationManager 添加到 class

private AuthenticationManager authenticationManager

并且还包括以下内容setter

public void setAuthenticationManager(AuthenticationManager authenticationManager)
{
    this.authenticationManager = authenticationManager;
}

bean 在 spring-security.xml 中初始化,如下所示:

<beans:bean id="x509AuthenticationFilter" class="com.example.sec.x509.X509AuthenticationFilter">
    <beans:property name="authenticationManager" ref="authenticationManager"/>
</beans:bean>

名为 authenticationManager 的 bean 确实存在并且存在于 spring 上下文中。

但是,在这样的配置下,我收到以下启动错误:

An AuthenticationManager must be set

出于某种原因,AuthenticationManager 在 superclass 中被故意设置为 null。稍后 afterPropertiesSet() 被调用并不幸抛出异常。

我想到的唯一解决方法是将我自己的 class 中的 setter 更改为以下内容:

public void setAuthenticationManager(AuthenticationManager authenticationManager)
{
    super.setAuthenticationManager(authenticationManager);
    this.authenticationManager = authenticationManager;
}

有更好的解决方案吗?

I added my own AuthenticationManager to the class

所以你有效地 shadowed existing authenticationManager instance declared in AbstractPreAuthenticatedProcessingFilter.

如果您不需要从 X509AuthenticationFilter 中访问 AuthenticationManager,就不要声明它。如果你这样做,你将不得不像你已经在做的那样调用 super setter。

也许 authenticationManager 应该在 AbstractPreAuthenticatedProcessingFilter 中声明 protected,这将彻底解决这种情况...