在springsecurity中从jdbcTemplate中检索数据

时间:2017-07-03 19:37:42

标签: java mysql spring spring-security javabeans

我正在使用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),也应该可以至少重复一次

完整代码为herebank.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 =?

1 个答案:

答案 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/>