gpt4 book ai didi

java - 在Spring Security中从jdbcTemplate检索数据

转载 作者:行者123 更新时间:2023-11-29 10:44:23 25 4
gpt4 key购买 nike

我正在使用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 =?

最佳答案

如果我正确理解您只想测试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/>

关于java - 在Spring Security中从jdbcTemplate检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44892863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com