2014-09-30 2 views
-1

Java로 인증 시스템을 만들려고하는데이 방법이 효과가 있는지 잘 모르겠습니다. 논리적으로 나에게이 코드는 첫 번째 행 (id = 1)만을 가져오고 이후에는 아무 것도 가져 오지 않을 것인가? 반면 대신 ifJava MySQL 및 Java 혼동

public boolean authUser(String user, String pass) throws Exception 
{ 
    boolean authenticated = false; 
    int id = 0; 
    String username = "", password = ""; 

    Connection authConn = getConnection(); 

    Statement stat = authConn.createStatement(); 
    String query = ("SELECT * FROM users ORDER BY id DESC LIMIT 1;"); 
    ResultSet rs = stat.executeQuery(query); 

    if(rs.next()) 
    { 
     id = rs.getInt("id"); 
     username = rs.getString("user"); 
     password = rs.getString("pass"); 
    } 
    else 
    { 
     System.out.println("Error 20-01: Empty Table"); 
    } 

    authConn.close(); 

    if(username.equals(user)) 
    { 
     if(password.equals(pass)) 
     authenticated = true; 
     else 
     System.out.println("Incorrect Password!"); 
    } 
    else 
    { 
     authenticated = false; 
     System.out.println("Incorrect Username!"); 
    } 



    return authenticated; 
} 
+1

? 쿼리는 일치하는 결과의 마지막 레코드를 반환합니다. –

+0

글쎄, 나는 사용자를 인증하려고 시도하고있다. 그래서 그것은 모든 테이블을 조사하여 어떤 조합과도 일치 하는지를 확인한다. MySQL DB에 액세스 할 수 없으므로 테스트하지 않았습니다. 방금 앉아서 코딩했는데 제대로 작동하는지 확신 할 수 없습니다. – Hondjie

+0

이러한 예제는 인터넷에서 사용할 수 있으며 귀하의 요구 사항은 무의미한 논리입니다. – Ankit

답변

1
public boolean authUser(String user, String pass) throws Exception 
{ 
    boolean authenticated = false; 
    int id = 0; 
    String username = "", password = ""; 

    Connection authConn = getConnection(); 

    Statement stat = authConn.createStatement(); 
    String query = ("SELECT * FROM users where userName='" + user + "';"); 
    ResultSet rs = stat.executeQuery(query); 

    while(rs.next()){ 
     id = rs.getInt("id"); 
     username = rs.getString("user"); 
     password = rs.getString("pass"); 
    } 

    authConn.close(); 

    if(username.equals(user)){ 
     if(password.equals(pass)){ 
      authenticated = true; 
     }else{ 
      authenticated = false; 
      System.out.println("Incorrect Password!"); 
     } 
    } 
    else{ 
     authenticated = false; 
     System.out.println("Incorrect Username!"); 
    } 
    return authenticated; 
} 

사용 데이터를 얻을 수 있습니다. 당신도 거기에 하나의 기록을 알고 있습니다.

authenticated = false도 암호가 일치하지 않는 경우도 있습니다.

검색하려는 사용자 세부 정보에 대한 쿼리를 제공해야합니다. 1 명의 lac 사용자가 있다고 가정하면 모든 사용자를 나열합니다. &은 userName을 추가 했으므로 마지막 행 대신 사용자를 검색하므로 좋을 것입니다.

& userName 또는 userId가 고유해야하며 그렇지 않으면 여러 행을 반환해야합니다.

& PreparedStatement을 사용하면 더 좋을 것입니다.

where 절에 username 또는 userid을 입력해야 더 효율적으로 인증 프로세스를 수행 할 수 있습니다. 특히 사용자의 입력을 처리

+0

왜 주문해야합니까? 당신은 특정 사용자를 찾고 있습니다 – vlatkozelka

+1

@vlatkozelka : 오, 죄송합니다. 한계 조항도 삭제했습니다. –

0

아주 나쁜 예 : 당신의 SQL 쿼리에 절은 테이블에 사용자 및 암호와 일치하도록

// got rid of ORDER BY and LIMIT - shouldn't userName be unique? 
// in your select list avoid '*' select only columns that you need 
PreparedStatement ps = authConn.prepareStatement("SELECT pass FROM users where userName = ?"); 
ps.setString(1, user); 
ResultSet rs = ps.executeQuery(); 
if (rs.next()) { 
    password = rs.getString("pass"); 
} 
authConn.close(); 
0

넣어 :

Statement stat = authConn.createStatement(); 
String query = ("SELECT * FROM users where userName='" + user + "' ORDER BY id DESC LIMIT 1;"); 
ResultSet rs = stat.executeQuery(query); 

위에서 교체합니다. 테이블에 행이 있으면 USER USER 액세스 거부를 인증 할 수 있습니다.

public boolean authUser(String user, String pass) throws Exception 
{ 
boolean authenticated = false; 
int id = 0; 
String username = "", password = ""; 

Connection authConn = getConnection(); 

Statement stat = authConn.createStatement(); 
String query = ("SELECT * FROM users Where user = '"+username+"' and pass = '"+password+"'); 
ResultSet rs = stat.executeQuery(query); 

if(rs.next()) 
{ 
    System.out.println("Incorrect Password!"); 
    id = rs.getInt("id"); 
} 
else 
{ 
    System.out.println("Incorrect Username!"); 
    authenticated = true; 
} 

authConn.close(); 


return authenticated; 

}

당신이 원하는 무엇을