2 votes

Une correspondance habile sur une variable chiffrée

Comment sélectionner sur une variable cryptée avec Slick.

J'ai un mot de passe encodé par BCrypt dans ma base de données.

Pour illustrer mes intentions :

def login(name: String, password: String) = Action {
...
  for {
    u <- Users if u.name === name && BCrypt.checkpw(password, u.password)
  } yield u

Bien sûr, Slick se plaint que u.password est une colonne levée et non une chaîne.

Comment allez-vous vous y prendre pour résoudre le problème ?

3voto

Farmor Points 4928

En fait, j'ai réussi à résoudre mon problème.

  def login(name: String, password: String) = Action {
    database withSession {
      (for {
        u <- Users if u.name === name 
      } yield u).list
    } match {
      case Nil => Ok("No user found")
      case head :: tail => 
        if(BCrypt.checkpw(password, head.password))
          Ok("accepted").withSession("userid" -> head.id.get.toString)
        else
          Ok("Incorrect password")
    }
  }

0voto

MeltedPenguin Points 637

J'ai eu la même question mais dans une classe de modèle.

Puisque votre solution a inspiré la mienne, je vais la poster ici en espérant qu'elle puisse aider.

def authenticate(email: String, password: String): Future[Option[User]] = db.run {
    Users.filter{_.email === email}.result.headOption
  } map {
    case Some(u) if BCrypt.checkpw(password, u.password) => Some(u)
    case _ => None
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X