私はそのパスワードハッシュとユーザー名の組み合わせを経由してDBから単純なオブジェクトをretriveしようとしていますこんにちは....HQLクエリはちょうどuniqueResult(と飛ぶことはありません)
username = request.getParameter("username");
password = request.getParameter("password");
// Converting request password to hash
String passwordHash = SecurityUtil.convertStringToSHA1(password);
Session hs = HibernateUtil.getSessionFactory().getCurrentSession();
hs.beginTransaction();
//query for a single result of matching username with password
//Query hquery = hs.createQuery("from User where id = :id");
//hquery.setParameter("id", 33l); <- THIS QUERY WORKS
Query hquery = hs.createQuery("from User where password = :password and userName = :userName"); //<- password is a sha1 hash in the db
hquery.setString("userName", username);
hquery.setParameter("password", passwordHash);
User user = (User)hquery.uniqueResult(); //<- Always NULL WHY There should be a unique result.
log.info("UR: "+username);
log.info("PR: "+passwordHash);
if(user!=null) {
//never reached
log.info("UDB: "+user.getUserName());
log.info("PDB: "+user.getPassword());
} else {
always reaches here
}
任意のアイデア?それとも、uniqueResultsがないということですか?
私のSHA1ハッシュは塩漬けされていない、しかし、パスワードハッシュは...多かれ少なかれ、衝突があってはならないapacheのコモンズを使用してランダムな文字列から生成され
さらに、それはので、私は初めてやって休止状態のものですどこかで間違っている可能性があります...
あなたはどのデータベースを実行していますか? hibernate構成で 'hibernate.show_sql = true'と' hibernate.format_sql = true'を使ってSQLログを有効にし、取得したSQLクエリを確認してください。クエリに渡されるパスワードハッシュが実際にデータベース内のパスワードハッシュと同じであることを確認してください(多分、これは文字列エスケープの問題です)。 – tscho
ええ、私はロギングの頭のためにエスケープの問題を考えていた....私はそれを試してみましょう。私はmysqlを実行しています.... – mahatmanich