我使用spring 3.2,spring security 3.1和自定义身份验证器。
我的security-context.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<sec:http use-expressions="true">
<sec:form-login
login-page="/login.html"
default-target-url="/index.html"
always-use-default-target='true'
authentication-failure-url="/login-error.html"
/>
<sec:logout
logout-url="/j_spring_security_logout"
invalidate-session="true"
logout-success-url="/login.html"
/>
<sec:intercept-url pattern="/**" access="hasRole('ROLE_USER')" requires-channel="any"/>
<sec:http-basic />
</sec:http>
<sec:authentication-manager>
<sec:jdbc-user-service data-source-ref="dataSource"/>
<sec:authentication-provider ref="customAuthenticationProvider" />
</sec:authentication-manager>
<bean class="org.springframework.security.authentication.dao.DaoAuthenticationProvider" id="daoAuthenticationProvider">
<property name="userDetailsService" ref="authService"/>
<property name="passwordEncoder" ref="passwordEncoder"/>
</bean>
<bean class="com.test.UserDetailsServiceImpl" id="authService">
<property name="passwordEncoder" ref="passwordEncoder"/>
</bean>
<bean class="com.test.services.util.Encoder" id="passwordEncoder"/>
我收到此错误:
Error creating bean with name 'userDetailsService' defined in class path resource [config/security-context.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required
我的实施课程
@Service("userDetailsService")
public class UserDetailsServiceImpl extends JdbcDaoImpl implements UserDetailsService {
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
...
}
}
我也有,但是如果我们检查以前的错误,这个代码似乎没有被看到。
@Configuration
@EnableTransactionManagement
public class DBConfiguration {
@Bean(name = "dataSource")
public BasicDataSource dataSource() {
...
}
}
任何想法?
答案 0 :(得分:0)
JdbcDaoImpl用于使用jdbc查询从数据库检索用户详细信息的功能。假设一个默认的数据库模式,有两个表&#34;用户&#34;和&#34;当局&#34;因此它需要一个数据源或jdbc模板(这个先决条件来自JdbcDaoImpl从JdbcDaoSupport延伸的事实,这显然需要这些)。 要实施您自己的身份验证提供程序,请查看here,here
答案 1 :(得分:0)
@Service("userDetailsService")
public class UserDetailsServiceImpl extends JdbcDaoImpl implements UserDetailsService { ... }
删除@Service
注释,如果你有一个组件扫描(我假设),这个bean将被选中。随着JdbcDaoImpl
的扩展,JdbcDaoSupport
扩展DataSource
,则需要JdbcTemplate
或<bean class="com.test.UserDetailsServiceImpl" id="authService">
<property name="passwordEncoder" ref="passwordEncoder"/>
</bean>
。但是,默认情况下无法自动装配。
<bean class="com.test.UserDetailsServiceImpl" id="authService">
<property name="passwordEncoder" ref="passwordEncoder"/>
<property name="dataSource" ref="dataSource" />
</bean>
此外,您的bean定义缺少对数据源的引用。
authService
您的<sec:jdbc-user-service data-source-ref="dataSource"/>
并没有做太多,因为您还有<sec:authentication-provider ref="customAuthenticationProvider" />
构建Spring Security的默认实例。删除该元素并对authService
进行更改以引用您的<sec:authentication-provider user-service-ref="authService" />
。
<sec:authentication-manager>
<sec:authentication-provider user-service-ref="authService">
<sec:password-encoder ref="passwordEncoder"/>
</sec:authentication-provider>
</sec:authentication-manager>
<bean class="com.test.UserDetailsServiceImpl" id="authService">
<property name="passwordEncoder" ref="passwordEncoder"/>
<property name="dataSource" ref="dataSource" />
</bean>
<bean class="com.test.services.util.Encoder" id="passwordEncoder"/>
基本上以下内容应该足够了
DaoAuthenticationProvider
您不需要像Spring Security为您完成的{{1}}。