从3.0.2升级到3.1.2后,Web App将无法启动

时间:2012-08-27 08:37:56

标签: spring-security

我有一个使用自定义身份验证器

的3.0.2 applicationContext-security.xml
<global-method-security pre-post-annotations="disabled">

</global-method-security>

<http use-expressions="true">

    <intercept-url pattern="/diagnostics/**" access="hasRole('ROLE_USER')" />


    <form-login login-page="/genesis" default-target-url="/diagnostics/start-diagnostics"
      authentication-failure-url="/genesis?authfailed=true"
      authentication-success-handler-ref="customTargetUrlResolver"/>
      <access-denied-handler error-page="/genesis?notauthorized=true"/>

     <logout logout-success-url="/genesis"/> 
    <session-management session-authentication-error-url="/genesis"> 
        <concurrency-control max-sessions="1" expired-url="/genesis?sessionExpired=true"/> 
    </session-management>
</http>

<authentication-manager>
<authentication-provider ref="genesisAuthenticator">
    <jdbc-user-service data-source-ref="dataSource"/>
</authentication-provider>
</authentication-manager>

<beans:bean id="genesisAuthenticator" class="com.blackbox.x.web.security.Authenticator"/>
<beans:bean id="customTargetUrlResolver" class="com.blackbox.x.web.security.StartPageRouter"/>   

</beans:beans>

升级到3.1.2后,我的应用程序无法启动,我收到错误消息

“配置问题:与'ref'属性一起使用时,authentication-provider元素不能包含子元素”。我假设问题在于

<jdbc-user-service data-source-ref="dataSource"/>

元素,其中data-source-ref指向application-context.xml文件中的定义。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/genesis"/>
<property name="username" value="dbuser"/>
<property name="password" value="********"/>

我需要做些什么来实现这一目标。退回到3.0.2并不是一个真正的选择。

1 个答案:

答案 0 :(得分:0)

如果您使用自定义AuthenticationProvider实现,则必须以“传统”Spring方式在XML中配置它,因为<security:authentication-provider ref="yourImpl">只指向可以在 的bean >无论如何,根本不必使用UserDetailsService。在您的示例中,您尝试使用jdbc-user-service,这只是创建JdbcDaoImpl bean的快捷方式。

因此,您需要做的是确保所有genesisAuthenticator依赖项都由您自己解决,而不是Spring Security。那就是你应该向你的bean添加@Autowired setUserDetailsService(UserDetailsService userDetailsService)方法或者像这样用XML配置它(使用id属性):

<beans:bean id="genesisAuthenticator"
    class="com.blackbox.x.web.security.Authenticator">
  <property name="userDetailsService" ref="jdbcUserService"/>      
</beans:bean>

<jdbc-user-service id="jdbcUserService" data-source-ref="dataSource" />