2012-09-08 74 views
2

我有以下代碼:有沒有更習慣用Casbah檢查密碼的方法?

 
def authenticateByUsername(username: String, password:String): Boolean = { 
    val user = users.findOne(MongoDBObject(USERNAME -> username)) 
    if(user.isDefined){ 
     val pw = user.get.getAs(PASSWORD) 
     if(pw.isDefined) 
      BCrypt.checkpw(pw.get, password) 
     else false 
    }else false 
} 

是否有這樣做的更地道的方式?這是一個if-else的噩夢,在Scala中看起來不太合適。

回答

2

你是對的,有一個更好的方法,並且一般在Option上使用get(或者稍微小一點的isDefined)是一個紅旗。在這種情況下,你可以使用一個for -comprehension:

def authenticateByUsername(username: String, password: String): Boolean = { 
    val result: Option[Boolean] = for { 
    user <- users.findOne(MongoDBObject(USERNAME -> username)) 
    pass <- user.getAs(PASSWORD) 
    } yield BCrypt.checkpw(pass, password) 

    result getOrElse false 
} 

或者,多了幾分簡潔:

def authenticateByUsername(username: String, password: String): Boolean = 
    users.findOne(MongoDBObject(USERNAME -> username)).flatMap(
    _.getAs(PASSWORD) 
).map(
    BCrypt.checkpw(_, password) 
).getOrElse(false) 

後者本質上是的for -comprehension只是脫糖的版本。

+0

這樣比較好,我有類似的東西,但我沒有考慮將'result'包裹在一個選項中,然後對結果使用'getOrElse'。 我發現第一個更可讀。當大聲朗讀時,聽起來更有意思。 – wbarksdale

相關問題