@Override
  public CompteUtilisateur authentifier(Credentials credentials) throws ServiceException {
    // if(infos.getTimestampDebut()!=null)
    //	serviceException(ServiceExceptionType.IDENTIFICATION_COMPTE_UTILISATEUR_CONNECTE);

    CompteUtilisateur compteUtilisateur =
        ((CompteUtilisateurDao) dao)
            .readByUsername(credentials.getUsername()); // readByCredentials(credentials);
    // Boolean verouille = compteUtilisateur!=null && compteUtilisateur.getVerrou()!=null /*&&
    // isValidTokenDeverouillage(compteUtilisateur.getTokenDeverouillage())*/;

    if (compteUtilisateur == null) // aucun compte avec ce username a été trouvé
    serviceException(ServiceExceptionType.IDENTIFICATION_COMPTE_UTILISATEUR_INCONNU);

    // System.out.println("Found token :
    // "+ToStringBuilder.reflectionToString(compteUtilisateur,ToStringStyle.MULTI_LINE_STYLE));
    // dao.create(new CompteUtilisateur(new Credentials(RandomStringUtils.randomAlphabetic(4),
    // RandomStringUtils.randomAlphabetic(4)), compteUtilisateur.getUtilisateur(), null));
    // for(CompteUtilisateur c : ((CompteUtilisateurDao)dao).readAll())
    //	System.out.println(c);

    // un compte avec ce username a été trouvé
    infos.setNombreTentative(infos.getNombreTentative() + 1);
    // System.out.println("CompteUtilisateurServiceImpl.authentifier()
    // "+infos.getNombreTentative());
    if (!compteUtilisateur
        .getCredentials()
        .equals(credentials)) { // le mot de passe ne correspond pas
      if (compteUtilisateur.getVerrou() == null
          && infos.getNombreTentative() == MAX_TENTATIVE_AUTH) {
        verouiller(compteUtilisateur, Cause.ACCESS_MULTIPLE);
        serviceException(
            ServiceExceptionType.IDENTIFICATION_COMPTE_UTILISATEUR_INCONNU,
            Boolean.FALSE); // we do not roll back transaction
      } else serviceException(ServiceExceptionType.IDENTIFICATION_COMPTE_UTILISATEUR_INCONNU);
    }

    if (compteUtilisateur.getVerrou() != null) {
      notifierVerrou(compteUtilisateur);
      serviceException(ServiceExceptionType.IDENTIFICATION_COMPTE_UTILISATEUR_VEROUILLE);
    }

    infos.setTimestampDebut(System.currentTimeMillis());
    authentificationInfos.setCompteUtilisateur(compteUtilisateur);
    return compteUtilisateur;
  }