2012-09-08 37 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

相关问题