Сервлет Java / JSP: Проверка, является ли роль NULL или администратором в Базе данных - PullRequest
0 голосов
/ 26 октября 2018

Я создал следующую функцию, которая должна проверять, содержит ли столбец «role» в моей базе данных admin или значение Null (что означает, что это обычный пользователь). Я пытаюсь проверить его в моем классе сервлетов , как показано в приведенном ниже коде, но он перенаправляет меня на страницу USER JSP каждый раз. Есть ли ошибка в моем методе checkRole()? Заранее спасибо.

checkRole() метод

public static boolean checkRole() {

    boolean find = false;
    PreparedStatement pst = null;  
    ResultSet rs = null;  
    try(Connection conn= ConnectionConfiguration.getConnection()){
        pst = conn.prepareStatement("SELECT * FROM users WHERE role=?;");  
        pst.setString(1, role);  
        rs = pst.executeQuery();
        while (rs.next()) {
       if (rs.getString("role").equals("admin") {
           find = true;
            } else {find = false;}
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return find;  
}

СЕРВЛЕТ-код

        { 
                String pass1 = request.getParameter("password");
                String email = request.getParameter("email");

            //checks whether user credentials are right and if it is admin
                if(User.validate(email,pass1) && User.checkRole()){

                    request.setAttribute("email",request.getParameter("email"));
                    request.setAttribute("pass", request.getParameter("password"));
                    s.invalidate();
                    forwardTo(ctx, request, response, "/Admin.jsp");
                }

     //checks whether user credentials are right and if it is a regular user
                else if (User.validate(email, pass1) && !User.checkRole()) {

                        request.setAttribute("email",request.getParameter("email"));
                        request.setAttribute("pass", request.getParameter("password"));
                        s.invalidate();
                        forwardTo(ctx, request, response, "/RegularUser.jsp");
                    }

                else {

                    //show some error message

                }
            }

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Измените свой метод checkRole на

public static boolean checkRole(String email) {

    boolean find = false;
    PreparedStatement pst = null;  
    ResultSet rs = null;  
    try(Connection conn= ConnectionConfiguration.getConnection()){
        pst = conn.prepareStatement("SELECT * FROM users WHERE email =? and role='admin';");  
        pst.setString(1, email);  
        rs = pst.executeQuery();
        if(rs.next()) {
           find = true;
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return find;  
}

И в коде вашего сервлета напишите, если условие будет

 if(User.validate(email,pass1) && User.checkRole(email))
0 голосов
/ 27 октября 2018

Ваш метод checkRole () всегда будет иметь значение true, если у вас в таблице пользователей несколько пользователей с разными ролями.Потому что вы выбираете все строки, где роль поля имеет определенный тип.И если определенный тип роли существует в вашей таблице пользователей, он всегда будет верным ...

Как уже упоминалось в другом ответе, вам нужно передать уникальный идентификатор.Как еще запрос должен знать, для какого пользователя вы проверяете роль?В большинстве приложений это делается с помощью поля user_id / id, но так как у вас есть только электронная почта здесь, вы также можете использовать это.Я бы сделал что-то вроде этого:

public static boolean isAdmin(String email) {

boolean check = false;
PreparedStatement pst = null;  
ResultSet rs = null;  
try(Connection conn= ConnectionConfiguration.getConnection()){
    pst = conn.prepareStatement("SELECT * FROM users WHERE email =? and role='admin';");  
    pst.setString(1, email);  
    rs = pst.executeQuery();
   check = rs.next(); // if the resultSet has results, then check will evaluate to true

} catch (SQLException e) {
    e.printStackTrace();
}
return check;  
}

Тогда для вашего сервлета:

       { 
                    String pass1 = request.getParameter("password");
                    String email = request.getParameter("email");

         //first check if valid login details (seperate it out so you can be more specific in the error you give back, and you don't have to repeat yourself)
         if(User.validate(email,pass1)){
             // s.invalidate(); //this isn't really necessary here, normally you invalidate the session variables when the user logs out. If a different user logs in (whilst one is already logged in), then any session variables you have set would override it.
              String url = "/RegularUser.jsp";
              String role = "regular";
              //now check if user is admin
              if(User.isAdmin(email)){
                url = "/Admin.jsp" 
                role = "admin";
              }
          //set your session variables
          //s.setAttribute("user_email", email);
          //s.setAttribute("user_role", role);

           forwardTo(ctx, request, response, url);

         }else{

        //wrong login details - set values back in form
        request.setAttribute("email",email); 
        request.setAttribute("pass", pass1);
        forwardTo(ctx, request, response, "/Login.jsp");
         }
}
0 голосов
/ 26 октября 2018

В методе checkRole () вам нужно выйти из цикла while после поиска администратора, иначе ваш логический элемент "find", вероятно, снова будет установлен в false на следующей итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...