如何在jsp中使用查询获取用户角色?

Posted

技术标签:

【中文标题】如何在jsp中使用查询获取用户角色?【英文标题】:How to get user roles using query in jsp? 【发布时间】:2014-12-30 23:49:29 【问题描述】:

我是 Java 新手,我希望使用 switch 语句进行基于角色的访问,但是当我执行查询并提供用户角色(例如用户或管理员)时,用户登录良好,但如果我将 (role='') 留空查询然后查询不能很好地执行并跳转到 else 语句。其次,如果我使用准备好的语句,那么我如何获得用户角色谢谢。这是我的代码。

<%
  String userid = request.getParameter("username");   
  String pwd = request.getParameter("password");
  Class.forName("com.mysql.jdbc.Driver");
  Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/auto_lube","root", "password");

  Statement st = con.createStatement();
  ResultSet rs;
  rs = st.executeQuery("select * from users where uname='" + userid + "' and pass='" + pwd + "' and role=''");  

  if (rs.next())            
    String username =  rs.getString("uname");
    String email =  rs.getString("email");
    String rolle =  rs.getString("role");
    session.setAttribute("customer_name", username); 

    int usser =  rs.getInt("id");
    session.setAttribute("customer_id", usser);
    switch(rs.getInt(rolle))                   
      case 1:
        if (rolle.equals("admin"))                   
          response.sendRedirect("adminPage.jsp");
          break;
        

      case 2:
        if (rolle.equals("user"))                  
          response.sendRedirect("user.jsp");
        
        break;

      case 3:
        if (rolle.equals("assistant"))                  
          response.sendRedirect("assistant.jsp");
        
        break;

      case 4:
        if (rolle.equals("supplier"))                  
          response.sendRedirect("supplier.jsp");
        
        break;

      default:
        break;
     
   else 
  out.print("invalid");
   
%>         

【问题讨论】:

st.executeQuery("select * from users where uname='" + userid + "' and pass='" + pwd + "' and role=''"); SQL注入源 如果你没有传递任何角色,那么你可以将他重定向到 users.jsp 并且你的控制不应该来自 JDBC 代码。 我在角色后加了双引号,显示错误 如果我设置用户角色,那么如何执行 switch 语句,因为我应该为多个角色编写多个查询,这不是一个好习惯? 【参考方案1】:

恭喜,你只放了一段代码就做了很多不好的做法!

您在 JSP 中放置了很多 scriptlet。您最好使用 servlet 进行此处理,并且仅将 JSP 用于视图(显示)部分。 Servlet 是真正的 Java 类,因此更容易编写和测试。

您在不使用准备好的语句的情况下在查询中连接用户输入字符串(但我承认您注意到了 :-))。 千万不要这样做,这是一个 SQL 注入的开放陷阱(只需 google 即可)

您将明文密码存储在数据库中。好的做法建议只存储密码的不可逆哈希。如果数据库被攻破,攻击者将无法获取密码。

您在查询中强加role = ''。如果你能找到 admin 的角色,我会感到非常惊讶!

您使用角色来选择重定向到哪个页面。这本身并不是一个不好的做法,但如果您不测试该用户在重定向页面中是否具有有效角色,则可能会出现这种情况。常见的用法是有一个单独的页面,其中部分仅根据角色显示(JSP 中的&lt;c:if&gt; blocs)。

rs.getInt(rolle) 是什么意思?你从结果集中得到rolle,直接使用它并在做任何rolle.equals(...)之前测试它是否为null(NPE不远)

对于准备好的语句,你可以这样做:

PreparedStatement st = connection.prepareStatement("select * from users where uname=? and pass=?");
st.setString(1, userid);
st.setString(2, pwd);
ResultSet rs = st.executeQuery();

这样,不仅可以保护您免受 SQL 注入,而且您可以从数据库中获取来自 useridpwd 的行,无论角色是什么。

编辑:

查询后,您仍然可以从users 表中读取任何属性:

  if (rs.next())            
    String username =  rs.getString("uname");
    String email =  rs.getString("email");
    String rolle =  rs.getString("role");
    session.setAttribute("customer_name", username); 

    int usser =  rs.getInt("id");
    session.setAttribute("customer_id", usser);

测试应该是

if (rolle == null || role.isEmpty()) 
    // process no role case first - it deals with the null role problem

else if (role.equals("admin") 
    ...

...
else 
    // process for unknown role

【讨论】:

非常感谢,请分享任何相关示例的链接,以便清楚理解。 请告诉我,如果我只使用上面准备好的语句而不使用角色,那么我如何使用 switch 语句。谢谢 @Balajeet,您混淆了输入和输出查询参数。查看我的编辑。 非常感谢您的指导。

以上是关于如何在jsp中使用查询获取用户角色?的主要内容,如果未能解决你的问题,请参考以下文章

在jsp页面中如何获取到当前登录用户的角色id

如何使用 Spring Security 获取当前用户的角色

如何根据用户角色有条件地显示 JSP 页面的元素

如何在使用实体框架时获取所有用户角色

如何在 _LoginPartial 的代码部分中获取用户角色?

在 Mongoose 中,我有具有一对多关系的用户和角色模式。如何查询特定用户是不是具有“管理员”角色?