2011-12-10 26 views
1

你好我試圖通過它的密碼哈希和用戶名組合以檢索來自DB一個簡單的對象....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 
} 

什麼想法?或者這是否意味着沒有獨特的結果?

我的SHA1哈希不鹹,但是密碼哈希值,從一個隨機字符串使用Apache公地應該或多或少的無碰撞產生的...

而且這是我第一次做的Hibernate的東西,所以我可能在某處出錯...

+0

您運行的是哪個數據庫?在hibernate配置中用'hibernate.show_sql = true'和'hibernate.format_sql = true'打開SQL日誌記錄,並檢查你得到的SQL查詢。確保傳遞給查詢的密碼散列與數據庫中的密碼相同(也許這是一個字符串轉義問題)。 – tscho

+0

是啊,我一直在考慮逃避問題,感謝在日誌記錄上的頭......我會試試看。我在mysql上運行.... – mahatmanich

回答

0

好吧,我現在知道哪裏都在流失。我在這些字段上啓用了jaspy字符串加密。由於隨機鹽,很顯然WHERE子句中的這些字段不會飛......: -/

1

如果您收到空值,則表示沒有找到匹配的記錄。

您的密碼散列可能存在一些問題。您可以從數據庫中獲取密碼值 - 用於評估和測試hibernate查詢的硬代碼。如果有效,你可以檢查你的輸入密碼爲什麼不同。

您也可以記錄哈希密碼,並檢查它是否與數據庫中的值匹配。還請檢查用戶名 - 區分大小寫,領導/培訓空間等。

+0

那麼看到另一個查詢,我得到的用戶通過ID工作得很好...如果我提取密碼,然後比較它與請求密碼它也等於... – mahatmanich

+1

那麼問題應該與用戶名。我很確定這是輸入參數的問題 - 查詢很好。 – gkamal

+0

如果我只是在第二個查詢的密碼,我也沒有得到任何結果,這真的很奇怪。通過ID它工作得很好,我相信我沒有在數據庫重複哈希,因爲只有一個結果?!?! – mahatmanich