如何使用servlet对用户进行身份验证

时间:2013-02-04 12:33:19

标签: java-ee authentication servlets login web

我是Java EE的新手。我创建了一个登录表单和servlet来验证用户的凭据,但是当我在验证后用getRemoteUser()方法检查远程用户时,我的代码没有显示用户名。

我的登录servlet是:

String uname,pass;
PreparedStatement ps=null;
uname=request.getParameter("uname");
pass=request.getParameter("pass");

ResultSet rs = null;
Connection con = null;
try {
    con = prepareConnection();

    String Query="select uname,email from passmanager where pass=?";
    ps=con.prepareStatement(Query);

    ps.setString(1,pass);
    rs=ps.executeQuery();

    while(rs.next())
    {
        if (uname.equals(rs.getString("uname")) || uname.equals(rs.getString("email"))) 
        {
            rs.close();                                                              
            ps.close();                                                            
            ps = null;                                                             
            con.close();                                                            
            con = null;  
            HttpSession session = request.getSession(true); 
            session.setAttribute("currentSessionUser",uname); 
            RequestDispatcher dis = request.getRequestDispatcher("/user.html");
            dis.forward(request, response);
            break;
        }
    }
}
catch(Exception e)
{
    System.out.println(e);
}

如果需要更改/修改,请告诉我并帮助我.....提前感谢。

3 个答案:

答案 0 :(得分:8)

HttpServletRequest#getRemoteUser()container managed authentication的一部分,它基本上只是<security-constraint>中的一个简单web.xml XML配置条目。

但是你有一个完全自制的servlet,它实际上也做了很糟糕的数据库交互(它在用户名和密码上用WHERE子句在Java中而不是在SQL中进行比较;此外,它还通过不在finally中关闭它们来泄漏JDBC资源。

你基本上有两种选择:

  1. 不要在家里进行身份验证。删除所有错误,低效和资源泄漏的代码并使用容器管理的身份验证。您可以在此答案中找到启动示例:Restrict JSP/Servlet access to specific users only

  2. 只需通过session.getAttribute("currentSessionUser")和/或${currentSessionUser}获取登录用户,然后在homegrow中添加servlet过滤器以获取访问限制。您可以在此答案中找到启动示例:Authenticating the username, password by using filters in Java (contacting with database)

答案 1 :(得分:2)

要添加@ BalusC的响应,还有另一种使用javax.servlet.http.HttpServletRequest Java Servlet 3.0 Java EE 6中的WebSphere V8.5 Liberty Profile安全方法 - login的安全方法进行容器管理身份验证的方法,logout {1}}和authenticate。它们是HttpServletRequest对象中的新方法,它们几乎没有引起注意(如果用这么简单的方式来获取这个Java EE版本,为什么它会有所不同呢?)。

无论采用哪种方法(编程方法或声明方法),您最终都必须在应用程序服务器中配置用户存储库(该部分是特定于容器的),并且可能定义一个领域以指向部署描述符中的用户存储库{ {1}}(默认情况可能不符合您的需求 - web.xmlBASICFORM)。

在您的情况下,servlet做得太多 - 负责检索用户的部分应该是应用程序服务器的自定义用户注册表处理程序的一部分(或者更好 - 重用应用程序服务器中已有的 - {{3} }或WebSphere V8.5)一旦定义,就使用CLIENT_CERT中的<security-constraint>或上述新的安全方法。

答案 2 :(得分:0)

您没有以这种方式记录您的用户。你所做的是设置一个名为“currentSessionUser”的会话属性,并且容器没有将其识别为“经过身份验证的用户”。

搜索“Realm配置(您的容器名称)”以查看如何执行此配置。每个容器都有自己的方法。 :)