【问题标题】:Is there a more idiomatic way to use Casbah to check a password?有没有更惯用的方法来使用 Casbah 检查密码?
【发布时间】:2012-09-08 01:17:37
【问题描述】:

我有以下代码:

def authenticateByUsername(用户名:字符串,密码:字符串):布尔 = { val user = users.findOne(MongoDBObject(USERNAME -> username)) 如果(用户.isDefined){ val pw = user.get.getAs(PASSWORD) 如果(pw.isDefined) BCrypt.checkpw(pw.get, 密码) 否则为假 }否则为假 }

有没有更惯用的方式来做到这一点?这是一个 if-else 的噩梦,这在 Scala 中似乎并不正确。

【问题讨论】:

    标签: scala mongodb casbah


    【解决方案1】:

    你说得对,有更好的方法,通常在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 的脱糖版本。

    【讨论】:

    • 这样更好,我有类似的东西,但我没有考虑将result 包装在一个选项中,然后在结果上使用getOrElse。我发现第一个更具可读性。大声朗读,听起来更感性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多