为什么我必须设置 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
,这将彻底解决这种情况...
在我的应用程序中,我实现了 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
,这将彻底解决这种情况...