我正在处理用户登录页面。我希望管理员可以访问管理员部分,但不能访问常规用户。以下代码有效,但如果管理员以外的用户登录,则会收到错误的密码错误并将其发送到正确的页面。如果允许否定答案和正面答案,我认为嵌套有问题。我非常感谢对此事的任何帮助。
try {
String sql="Select * from Users1";
String host ="jdbc:derby://localhost:1527/Nash";
String uName = "CON";
String uPass = "smokes";
Connection con = DriverManager.getConnection(host, uName, uPass);
Statement stmt=con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
String user= userName.getText();
String pwd= password.getText();
while(rs.next()) {
String uname=rs.getString("User_name");
String pass=rs.getString("Password");
String admin1=rs.getString("admin");
if ((user.equals(uname)) && (pwd.equals(pass)))
{
mainPanel.setVisible(true);
blankContent.setVisible(true);
adminButton.setEnabled(false);
receiptContent.setVisible(false);
memberContent.setVisible(false);
securityPanel.setVisible(false);
}
if ((user.equals(uname)) && (pwd.equals(pass))&&(admin1.equals("y")))
{
mainPanel.setVisible(true);
blankContent.setVisible(true);
adminButton.setEnabled(true);
receiptContent.setVisible(false);
memberContent.setVisible(false);
securityPanel.setVisible(false);
}
else
{
JOptionPane.showMessageDialog(null, "User name and password do"
+ " not match!","ALERT!", JOptionPane.ERROR_MESSAGE);
}
} } catch (SQLException ex) {
Logger.getLogger(program.class.getName()).log(Level.SEVERE, null, ex);
}
修改 以下是编辑的代码链接---> New revised code link
答案 0 :(得分:3)
您需要将else
移出一个级别。代码格式化很难说明发生了什么,但是else在admin if
语句中。像这样:
if ((user.equals(uname)) && (pwd.equals(pass)))
{
if (admin1.equals("y"))
{
// ... admin
}
else
{
// ... regular user
}
}
else
{
JOptionPane.showMessageDialog(null, "User name and password do"
+ " not match!","ALERT!", JOptionPane.ERROR_MESSAGE);
}
答案 1 :(得分:0)
喜欢
if ((user.equals(uname)) && (pwd.equals(pass)))
{
mainPanel.setVisible(true);
blankContent.setVisible(true);
receiptContent.setVisible(false);
memberContent.setVisible(false);
securityPanel.setVisible(false);
adminButton.setEnabled(false);
if(admin1.equals("y"))
adminButton.setEnabled(true);
}
else
{
JOptionPane.showMessageDialog(null, "User name and password do"
+ " not match!","ALERT!", JOptionPane.ERROR_MESSAGE);
}
答案 2 :(得分:0)
你正在做的每件事情都是正确的,除非你错过了导致这个问题的一个小故障(From your pastebin code in your comment)
。
你的同时声明在这里是个大问题。它将继续检查数据库中的所有记录。
获得所需用户后使用break
。
boolean isPass = false;
while(rs.next()){
// Your user authentication
if ((user.equals(uname)) && (pwd.equals(pass)))
{
if (admin1.equals("y")) {
// do your admin operation
break;
} else {
// do your non admin operation
break;
}
} else {
// if authentication fails
isPass = true
}
}
// Outside of while block
if(isPass){
// if authentication fails show error message
JOptionPane.showMessageDialog(null, "User name and password do"
+ " not match!","ALERT!", JOptionPane.ERROR_MESSAGE);
}
我展示了这段代码片段,以展示如何利用break并意识到你还应该break
为else part
另外明智地继续显示所有那些记录的错误消息在if
部分中对身份验证失败。
我建议从其他方法获取数据库值,并在另一种方法中进行身份验证。