Есть ли более идиоматичный способ использовать Casbah для проверки пароля?

У меня есть следующий код:

def authenticateByUsername (имя пользователя: строка, пароль: строка): Boolean = {
    val user = users.findOne(MongoDBObject(USERNAME -> username))
    если (user.isDefined){
        val pw = user.get.getAs(ПАРОЛЬ)
        если (pw.isDefined) 
            BCrypt.checkpw(pw.get, пароль)
        еще ложь
    } еще ложь
}

Есть ли более идиоматический способ сделать это? Это просто кошмар, который в Скале просто не подходит.

1 ответ

Решение

Вы правы, что есть лучший способ, и в целом, используя get (или, в несколько меньшей степени, isDefined) на Option это красный флаг. В этом случае вы можете использовать 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.

Другие вопросы по тегам