是否有更惯用的方式使用Casbah检查密码?

时间:2012-09-08 01:17:38

标签: scala mongodb 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中似乎不对。

1 个答案:

答案 0 :(得分:2)

你说这是更好的方法,通常在get使用isDefined(或稍微程度较小,Option)是一个红旗。在这种情况下,您可以使用for - 理解:

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 - 理解的一个荒谬版本。