我有一个使用自定义身份验证器
的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并不是一个真正的选择。
答案 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" />