2012-10-02 70 views
2

我想使用關於當前用戶的數據來驗證Play 2 Scala密碼更新表單。想象一下,再次收集當前密碼,新密碼和新密碼的表單。在驗證這個表格時,應該確定「當前密碼」的值是否與當前用戶的實際密碼匹配。在驗證中,我需要訪問當前用戶 - 這需要訪問當前請求。顯然請求是不是在範圍時我定義的形式:在Form Constraints中訪問當前請求

val updatePasswordForm = Form(mapping(
"currPassword" -> password, 
"newPassword" -> password, 
"newPasswordAgain" -> password)(PasswordUpdate.apply)(PasswordUpdate.unapply) 
verifying ("passwordsMustMatch", update => update.newPassword == update.newPasswordAgain) 
verifying ("incorrectCurrentPassword", pws => authenticate(GAH NEED CURRENT USERS EMAIL, update.currPassword))) 

我完全理解,具有在形式上驗證請求訪問將引入的窗體不需要的依賴關係。我只是很好奇,如果人們有一個聰明的方法來解決這個問題。我到目前爲止唯一的方法是這樣的:

def updatePassword = Action { implicit req => 
    validateCurrentPasswordMatches(updatePasswordForm).bindFromRequest.fold(
    .... 

我很想將這種依賴於請求的驗證包裝在共享的Form聲明中。

+0

一種方法是使updatePasswordForm成爲函數而不是val。然後,您可以將Request/userId/User傳遞給它進行驗證。儘管如此,我爲這種驗證所做的只是驗證了摺疊的成功功能。 – thatsmydoing

+0

但我不直接調用驗證碼,所以我無法控制傳入的內容。它在bindFromRequest –

回答

4

您可以使用功能,象這樣一個隱含定義Request參數獲取您的密碼更新形式:

def updatePasswordForm(implicit request: Request[_]) = Form(
    // define form here 
).verifying(...) 

請求參數隱式地從bindFromRequest函數傳遞。

authenticate函數現在可以訪問(也是隱式定義的)請求參數。您需要將其重新定義爲

def authenticate(/* old parameters */)(implicit request: Request[_]): Boolean = { 
    // implementation with access to the Request 
} 
+0

間接調用很好!你以前用過這個技巧嗎? –

+0

前幾天我遇到了同樣的問題,並按照所述解決了這個問題。 –