java - 验证用户 Mysql Java?
问题描述
我在这个开发中做了这个查询,但是我在接收 API 时遇到问题我尝试验证用户登录但总是 API 响应登录成功
我用 Java Spring Boot 和 Mysql 做到了这一点
这是我的代码:
@Override
public List<UserDto> getUsers() {
List<UserDto> list = new ArrayList<UserDto>();
try {
Connection con = getConnection();
PreparedStatement ps = con.prepareStatement("Select * from tableregister");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
UserDto data = new UserDto();
data.setName(rs.getString("name"));
data.setLastname(rs.getString("lastname"));
data.setEmail(rs.getString("email"));
data.setUsername(rs.getString("username"));
data.setNumber(rs.getString("number"));
data.setPassword(rs.getString("password"));
list.add(data);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
我首先做了这个 First
@Override
public ApiResponseDto getlogin(UserDto usersLogin) {
try{
Connection con = getConnection();
Statement st=con.createStatement();
ResultSet rs=st.executeQuery("select * from tableregister where username='"+usersLogin.getUsername()+"' and password='"+usersLogin.getPassword()+"'");
if (usersLogin.getUsername() != null && usersLogin.getPassword() != null) {
return new ApiResponseDto("Success", "Login: ");
} else {
ApiResponseDto apiResponseDto = new ApiResponseDto("Error", "Error Login");
apiResponseDto.setErrorCode(2);
return apiResponseDto;
}
} catch (Exception e) {
e.printStackTrace();
return new ApiResponseDto("Error", "Error: " + e.toString());
}
}
在这之后
@Override
public ApiResponseDto getlogin(UserDto usersLogin) {
try{
List<UserDto> list = getUsers();
Connection con = getConnection();
Preparestament ps =con.preparestament("select * from tableregister where username='"+usersLogin.getUsername()+"' and password='"+usersLogin.getPassword()+"'");
if (list.size() > 0 && (list.get(0).getUserName() != null && list.get(0).getPassword() != null)) {
return new ApiResponseDto("Success", "Login Success");
} else {
ApiResponseDto Obj = new ApiResponseDto("Error", "Error Login");
Obj.setErrorCode(1);
return Obj;
}
} catch (Exception e) {
e.printStackTrace();
return new ApiResponseDto("Error", "Error: " + e.toString());
}
}
所有的答案都是一样的
return new ApiResponseDto("Success", "Login Success");
解决方案
您分享的两个片段都是错误的。
在第一个片段中,您执行了一个查询(由于字符串连接,容易受到 SQL 注入的影响,顺便说一句),但忽略它的结果,只检查作为参数传递的对象。
在第二个片段中,您再次执行查询,但忽略结果,从数据库中获取所有用户,并检查其中是否存在。
相反,您需要根据传递的参数进行查询,并检查查询是否返回任何结果:
@Override
public ApiResponseDto getlogin(UserDto usersLogin) {
try {
// Assumption: The connection is pooled, and doesn't require closing.
Connection con = getConnection();
try (Preparestament ps = con.preparestament("select * from tableregister where username = ? and password = ?") {
ps.setString(1, usersLogin.getUsername());
ps.setString(2, userLoging.getPassword());
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
return new ApiResponseDto("Success", "Login Success");
} else {
ApiResponseDto obj = new ApiResponseDto("Error", "Error Login");
obj.setErrorCode(1);
return obj;
}
}
}
} catch (Exception e) {
e.printStackTrace(); // Or log the error somehow
return new ApiResponseDto("Error", "Error: " + e.toString());
}
}
PS:
请注意,在您的两个片段中,您都没有正确关闭 JDBC 对象,从而导致泄漏。这可以使用 try-with-resource 语法相对巧妙地完成。
推荐阅读
- python - 为 Python 3 清理未使用的函数变量或参数
- jbpm - 如何在 jBPM 6.4 中通过 REST 检索任务输出定义?
- angular - Angular5在子组件中绑定和更新实例
- r - 完整的数据框,缺少多个参数的日期范围
- javascript - 如何使用arraylist填充数据表
- angular - 无法使用 Karma 和 Jasmine 对 Angular 应用程序进行单元测试
- python - 如何在 Pandas 中将数据格式更改为“%Y%m%d”?
- c# - c#如何在点击时从图表中获取点数据?
- regex - 解析挑战 - 修复损坏的语法
- html - 将变量添加到服务器标签