使用Hibernate/JPA进行登录

3

你好,我正在尝试创建一个登录表单并使用Hibernate框架。

        String user = request.getParameter("username");
    String password = request.getParameter("password");

    EntityManagerFactory entityFactory = Persistence
            .createEntityManagerFactory("test");
    EntityManager entityManager = entityFactory.createEntityManager();

    String select = "SELECT userName, passWord FROM UserAccounts WHERE userName='"
            + user + "' and passWord='" + password + "'";

    Query query = entityManager.createQuery(select);

    if(query.getResultList().size() == 0){
        System.out.println("Account does not exist!");
    }else{
        System.out.println("Login Success!");
        UserAccounts login = (UserAccounts) query; //error here
        System.out.println(login.getUserName());
    }

问题是当尝试将查询结果转换为账户对象时,我遇到了一个错误。

正确的转换方法是什么? 谢谢!


请注意,将JPQL字符串与请求参数连接起来会引入安全漏洞。可以使用请求参数修改JPQL。 - René Link
永远不要将明文密码存储在数据库中 - 而是使用安全哈希 - Tobias Liefke
2个回答

4

使用变量并绑定参数以防止注入攻击,并选择UserAccounts对象。

String select = "SELECT ua FROM UserAccounts ua WHERE ua.userName=:userName and ua.passWord=:password";

Query query = entityManager.createQuery(select);
query.setParameter("userName", user);
query.setParameter("password", password);

使用getSingleResult(),因为用户/密码只应该识别一个用户。(还可以防止一些攻击),并将其转换为您选择的类(UserAccounts)。
UserAccounts ua = (UserAccounts) query.getSingleResult();

注意:永远不要以明文方式将密码存储在数据库中,而应使用单向哈希算法。例如:bcrypt


非常感谢!运行得非常好。还要感谢您提供的有关安全漏洞的信息! - pat3ck029
1
不要忘记捕获 NoResultException - 因为 getSingleResult() 期望 恰好 一个结果。如果用户输入了错误的信息,您将根本没有结果。并且 @Rene 请添加一条备注,指出存储明文密码是一个坏主意。 - Tobias Liefke

1
使用HQL查询。它返回UserAccounts类的实例。
String selectQuery = "FROM UserAccounts WHERE userName= :user and passWord= :password";

selectQuery.setParameter("user", user);
selectQuery.setParameter("password", password);

使用Query#setParameter来设置查询参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接