2014-02-27 37 views
0

如何在用户登录时验证某个电子邮件和密码?验证电子邮件地址和密码

protected void doPost(HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException { 

    String email=request.getParameter("email"); 
    String pass=request.getParameter("pass"); 

    OutputStream out = res.getOutputStream(); 

    try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/college", "root", "root"); 
      Statement st=con.createStatement(); 
      String strSQL = "SELECT email,password FROM student"; 

如何在SELECT语句后继续?我宁愿使用if...else声明来进行验证。

+1

我想你应该首先解释你的意思是“验证”。这也会帮助你思考这个问题。 –

+0

我认为这是更好地创建连接和初始化的OutputStream – Slimu

+3

我们不知道你的数据库结构,但为什么不'SELECT COUNT(*)FROM学生WHERE电子邮件=前做验证? AND密码=?'。使用['PreparedStatement'](http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html)。并且**不要在数据库中以明文存储密码**。 –

回答

0

如果你愿意,你可以使用。将输入用作where语句,然后检查是否存在匹配,错误或null,然后执行任何你想要的操作。

0

您可以在SQL语句本身中使用电子邮件和密码。如:

SELECT email, password from student where email = ? and password = ? 

准备上述语句并绑定参数。

这种方法验证将在数据库上完成,您只需检查结果计数(必须是1)。您应该在电子邮件列上有索引以获得更好的SQL性能。

0

您是否需要接收全部students

PreparedStatement st = con.prepareStatement("SELECT count(*) FROM student WHERE email=? AND password=?"); 
    st.setString(1, email); 
    st.setString(2, pass); 
    ResultSet rs = st.executeQuery(); 
    rs.next(); 
    int count = rs.getInt(1); 
    if (count == 1) { 
     // password and email are correct 
    } 
0

对于这个答案,我会认为,通过“验证电子邮件地址和密码”,你的意思是你要根据自己的电子邮件地址和密码来认证用户。而不是你想检查电子邮件地址是否是真实的电子邮件地址。

因此,您需要做的第一件事是使用散列算法和随机盐加密数据库中的密码。您将盐记录在哈希密码旁边。

接下来的事情是,当用户登录时,您会查找该用户的salt,并且您使用salt执行相同的散列操作。然后,将该结果与以前保存的密码哈希进行比较,如果它们相同,则密码相同。

重要的是盐对于每个用户都是随机的和不同的。

上述条款在互联网上有大量阅读。

一旦你这样做了,你也应该在其他答案中应用非常明智的建议,只选择你想要的用户,并正确处理你的资源。

警告我不是安全专家,也不是你。如果您正在为练习实施登录系统,那很好。如果是针对真实世界,请使用某人知道自己在做什么的东西。

2

第一个正确关闭所有连接资源 - 使用Java 7试用资源。

下面是一个简单的例子:

final String email = request.getParameter("email"); 
final String pass = request.getParameter("pass"); 
try (final Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/student", "root", "root"); 
     final PreparedStatement statement = con.prepareStatement("SELECT COUNT(*) AS count FROM student WHERE email=? AND password=?");) { 
    statement.setString(1, email); 
    statement.setString(2, pass); 
    try (final ResultSet resultSet = statement.executeQuery()) { 
     if (resultSet.next()) { 
      final int rows = resultSet.getInt("count"); 
      if (rows > 1) { 
       throw new IllegalStateException("More than one row returned!"); 
      } 
      boolean validUser = rows == 1; 
     } 
    } 
} 

不过说真的,你应该在数据库哈希密码。使用类似jBcrypt的东西。您的代码将如下所示:

final String email = request.getParameter("email"); 
final String pass = request.getParameter("pass"); 
try (final Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/student", "root", "root"); 
     final PreparedStatement statement = con.prepareStatement("SELECT pass FROM student WHERE email=?");) { 
    statement.setString(1, email); 
    statement.setString(2, pass); 
    try (final ResultSet resultSet = statement.executeQuery()) { 
     if (resultSet.next()) { 
      final String hash = resultSet.getString("pass"); 
      final boolean valid = BCrypt.checkpw(pass, hash); 
     } 
    } 
} 

显然,如果没有从查询返回的行,则需要添加错误检查。您还需要检查是否只返回一行。但我把它当做一个练习。

+0

如何使用MySQL散列函数,例如'SELECT COUNT(*)AS count FROM student WHERE email =? AND password = MD5(?)'? –

+0

@AntonBoritskiy MD5本身不具有密码安全性。您需要随密码一起存储的随机盐。 BCrypt通过创建一个可以存储的特殊格式的'String'来实现这一点,否则你需要自己做这个。 –

+0

谢谢你,jBcrypt看起来就像纯金。 – Gimby