我正在使用Spring-Security
使用以下bean
验证请求:
<authentication-manager>
<authentication-provider>
<password-encoder hash="sha" />
<jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password, enabled from users where username=?" authorities-by-username-query="select u.username, a.authority from users u, authorities a where u.username = a.username and u.username =?" />
</authentication-provider>
</authentication-manager>
我想检索user
表中的数据,例如启动应用程序。
以下是从mysql中提取受尊重的数据库的bean。数据库设置成功:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/bank" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
最后我有jdbcTemplate如下:
public class JdbcUserDAO implements UserDAO{
private DataSource dataSource;
private JdbcTemplate jdbcTemplate;
@Resource(name="dataSource")
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
setJdbcTemplateDataSource();
}
private void setJdbcTemplateDataSource() {
jdbcTemplate = new JdbcTemplate(dataSource);
}
}
问题是,我如何检索用户表的记录?。我见过this question,我不相信答案。即使数据源bean被创建一次(作为singelton),也应该可以至少重复一次
完整代码为here,bank.sql
为数据库架构。
我最想看到的是以下查询的结果:
select username, password, enabled
from users
where username = ?
select u.username, a.authority
from users u, authorities a
where u.username = a.username and u.username =?
答案 0 :(得分:1)
如果我正确理解你只想测试DataSource
,那么你可以编写简单的集成测试
你有几种方法:
如果您编写例如休息服务,您可以使用MockMvc
来测试您的身份验证的工作方式,例如
mockMvc.perform(post("/api/path/")
.principal(principal)
.content(this.json(someObject))
.contentType(contentType))
.andExpect(status().isOk());
并在测试前添加注释@WithMockUser(roles = "SOME_ROLE", password = "test", username = "test@test.com")
。
您也可以在只注入DataSource
的地方编写测试,并尝试进行您在DataSource
定义中编写的查询
我不确定是否有机会测试AuthenticationProvider
我会检查这个
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("path to your config")
public class Test{
@Autowired
@Qualifier("beanName")//should work without this, too
public DataSource ds;
@Test
public void test(){
Conection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
con = ds.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery("your query");
while(rs.next()) {
//assert or something else
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (SQLException e) {
//
}
}
}
并将其添加到您的配置<context:annotation-config/>