首页 > 解决方案 > 验证用户 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"); 

标签: javamysql

解决方案


您分享的两个片段都是错误的。

在第一个片段中,您执行了一个查询(由于字符串连接,容易受到 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 语法相对巧妙地完成。


推荐阅读