Есть ли более идиоматичный способ использовать 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.