2012-02-15 26 views
1

我试图创建人员和管理人员的单一登录系统我正确地有我的数据库设置和我的Java代码连接到数据库正常。我遇到的问题是,当用户登录在工作人员的基础上,在数据库中的用户名,然后一个工作人员的窗口会出现,或者如果管理者试图再次登录基于其数据库中的用户名经理窗口将出现Java的MySQL的登录系统确定用户

例如用于人员数据库的用户名看起来像这样STAFF1,STAFF1等和经理及其类似MNG1,mngr2等

我种得代码工作,但它只会加载经理查看某些原因。

final Statement s = conn.createStatement();  

ResultSet rs= s.executeQuery ("SELECT * FROM users where username='"+username1+"' && password='"+psw+"'"); 
String mng1="mng*"; 
String staff="staff*"; 
String pass1=""; 

while (rs.next()) 
{          
    mng1 = rs.getString (""); 
    staff =rs.getString (""); 
    pass1 = rs.getString ("password"); 

    if(username1.equals(mng1)&&psw.equals(pass1)) 
    { 
     ManagerMainMenu mng= new ManagerMainMenu(); 
     mng.main(null); 
     //System.out.println("its working"); 
    } 
    else if(username1.equals(staff)&&psw.equals(pass1)) 
    { 
     TakingOrder to = new TakingOrder(); 
     to.main(null); 
    } 
    else 
    { 
     System.out.println("password or username is wrong"); 
    } 
} 

回答

2

那么作为事实上这里回答你的问题

if(username1.equals(mng1)&&psw.equals(pass1)){ 
mng= new ManagerMainMenu() 

这种情况似乎总是正确的,你的情况 无论你的用户名1为空或空或别的东西 和也许密码也是正确的。 您在代码中没有执行任何与您的用户名不可见的 。 rs.getString(“”)最有可能返回您null。 所以你只是取消他们。 不要选择像select * from whatever这是一件坏事 对大表做特别,并没有真正看到你选择什么。

但你应该遵循 的建议和使用技巧和/或一些好的 ORM如hibernate或者使用好的老springjdbc也许。 :)


首先,我会强烈建议使用预准备语句 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html 它可以帮助您也可避免SQL注入以及应利用 数据库的资源,以更好的方式为SQL推移已经预编译进db。

这里的一些活生生的例子。

static public void setParameters(PreparedStatement preparedStatement, Object[] params) 
     throws SQLException 
{  

    if (params != null) 
    { 
     for (int i = 0; i < params.length; i++) 
     { 
      if (params[i] == null) 
      { 
       preparedStatement.setNull(i + 1, Types.INTEGER); 
       continue; 
      } 
      String className = params[i].getClass().getName(); 
      if (className.compareTo("java.lang.String") == 0) 
      { 
       preparedStatement.setString(i + 1, (String) params[i]); 
      } 
      else if (className.compareTo("java.lang.Integer") == 0) 
      { 
       preparedStatement.setInt(i + 1, ((Integer) params[i]).intValue()); 
      } 
     ...............///your types go here 
     } 

    } 
} 

public static ResultSet sqlSelect(Connection con, String sql, Object[] params) throws SQLException 
{ 
    ResultSet rs = null; 
    PreparedStatement preparedStatement = con.prepareStatement(sql); 
    try 
    { 
     setParameters(preparedStatement, params);///your parameters 
     rs = preparedStatement.executeQuery(); 
     logger.info(rs.toString()); 
    } 
    catch (SQLException e) 
    { 
     //TODO log.error("select failed: " + preparedStatement.toString()); 
     throw e; 
    } 
    return rs; 
} 

public static UserInfo getUser(String username,String pass) 
    { 
     UserInfo user=null; 
     Connection con=null; 
    ////  logger.info("user: "+username+" pass: "+pass); if you want to 
     String query = "SELECT id,username,password,email,name,company,description,enabled" + 
       " FROM users WHERE username=? and password=? and enabled=true;"; 

try{ 
      con = DBManager.getConnection(); 
      ResultSet rs = DBManager.sqlSelect(con,query,new String[]{username,pass}); 

      while(rs != null && rs.next()) 
      { 
       user = new UserInfo(); 

       user.setId(rs.getInt(1)); 
       user.setUsername(rs.getString(2)); 
       user.setPassword(rs.getString(3)); 
       user.setEmail(rs.getString(4)); 
       user.setFullName(rs.getString(5)); 
       user.setCompany(rs.getString(6)); 
       user.setDescription(rs.getString(7)); 
       user.setEnabled(rs.getBoolean(8)); 

     logger.info("user written"); 

      } 
     }catch(SQLException sqle){logger.info(sqle.getMessage());} 
     finally 
     { 
      if(con != null) 
       DBManager.freeConnection(con); 
     } 
     return user; } 

如果该方法返回与设置您的用户的用户是有效的。 您可能希望有用户和权限或组表,那么你 应该创建一个多到多台样users_permissions或users_groups如果你喜欢 这将有(ID,USER_ID,permission_id)或GROUP_ID,然后你将不得不这两个表用户加入 ,permissoins使用这个多对多表。 像这样

select u.user_id,p.permission from 
users u,user_permissions up,permissions p 
where u.user_id=up.user_id and up.permission_id=p.permission_id 
and u.user=? and u.password=? and u.enabled=1 

或使用联接:

select u.user_id,p.permission from 
users u 
inner join user_permissions up 
on u.user_id=up.user_id 
inner join permissions p 
on up.permission_id=p.permission_id 
where u.user=? and u.password=? and u.enabled=1 

,你调整你的选择和的getUser()方法。

的UserInfo POJO是这样的:


public class UserInfo { 
    private int id; 
    private String username; 
    private String password; 
    private String email; 
    private String fullName; 
    private String company; 
    private String description; 
    private List<Integer or String> permissions; 
//getters//setters 
} 

希望它可以帮助升技。

+0

这是完全抛弃我。我想我需要对此进行一些研究。 – 2012-02-15 21:56:50

+0

@Limpep是的先生。编辑后我会给出更多解释。 – 2012-02-15 22:01:44