Implémentation d'une authentification utilisateur avec les couches Servlet, Service et DAO
Vue d'ensemble
Cet article détaille la construction d'un système de connexion complet en Java, en s'appuyant sur les couches Servlet, Service et DAO. La couche DAO s'occupe de l'interaction avec la base de données pour extraire les informations utilisateur. La couche Service contient la logique métier, comme la validation des identifiants et la gestion des ressources. Enfin, la couche Servlet traite les requêtes HTTP, vérifie les données et effectue les redirections nécessaires.
Difficultés fréquentes
Un problème courant survient lors du déploiement sur Tomcat : le pilote JDBC pour MySQL peut ne pas être chargé. Pour y remédier dans IntelliJ IDEA, naviguez vers File -> Project Structure -> Artifacts. Sous le répertoire WEB-INF, créez un dossier nommé "lib" et y déplacez toutes les bibliothèques dépendatnes requises par l'application.
Mise en pratique
Couche DAO : Interface et implémentation
package com.example.auth.dao;
import com.example.auth.model.Utilisateur;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public interface UtilisateurDao {
Utilisateur obtenirUtilisateurParIdentifiant(Connection connexion, PreparedStatement declaration, ResultSet resultat, String requeteSql, Object[] parametres);
}
package com.example.auth.dao;
import com.example.auth.model.Utilisateur;
import com.example.auth.util.GestionBaseDonnees;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UtilisateurDaoImpl implements UtilisateurDao {
@Override
public Utilisateur obtenirUtilisateurParIdentifiant(Connection connexion, PreparedStatement declaration, ResultSet resultat, String requeteSql, Object[] parametres) {
Utilisateur utilisateur = new Utilisateur();
try {
resultat = GestionBaseDonnees.executerRequete(connexion, requeteSql, parametres, declaration, resultat);
if (resultat.next()) {
utilisateur.setAdresse(resultat.getString("address"));
utilisateur.setDateNaissance(resultat.getDate("birthday"));
utilisateur.setCode(resultat.getString("userCode"));
utilisateur.setNomComplet(resultat.getString("userName"));
utilisateur.setMotDePasse(resultat.getString("userPassword"));
utilisateur.setRoleUtilisateur(resultat.getString("userRole"));
utilisateur.setCreeParId(resultat.getInt("createdBy"));
utilisateur.setDateCreation(resultat.getDate("creationDate"));
utilisateur.setModifieParId(resultat.getInt("modifyBy"));
utilisateur.setDateModification(resultat.getDate("modifyDate"));
utilisateur.setGenreId(resultat.getInt("gender"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return utilisateur;
}
}
Couche Service : Logique métier
package com.example.auth.service;
import com.example.auth.model.Utilisateur;
public interface ServiceAuthentification {
Utilisateur authentifierUtilisateur(String codeUtilisateur);
}
package com.example.auth.service;
import com.example.auth.dao.UtilisateurDao;
import com.example.auth.dao.UtilisateurDaoImpl;
import com.example.auth.model.Utilisateur;
import com.example.auth.util.GestionBaseDonnees;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class ServiceAuthentificationImpl implements ServiceAuthentification {
private final UtilisateurDao utilisateurDao;
private final Connection connexion;
public ServiceAuthentificationImpl() {
this.utilisateurDao = new UtilisateurDaoImpl();
this.connexion = GestionBaseDonnees.ObtenirConnexion();
}
@Override
public Utilisateur authentifierUtilisateur(String codeUtilisateur) {
String requeteSql = "SELECT * FROM smbms_user WHERE userCode = ?";
Object[] parametres = {codeUtilisateur};
PreparedStatement declaration = null;
ResultSet resultat = null;
Utilisateur utilisateurTrouve = null;
try {
declaration = connexion.prepareStatement(requeteSql);
for (int i = 0; i < parametres.length; i++) {
declaration.setObject(i + 1, parametres[i]);
}
resultat = declaration.executeQuery();
if (resultat.next()) {
utilisateurTrouve = new Utilisateur();
utilisateurTrouve.setAdresse(resultat.getString("address"));
utilisateurTrouve.setDateNaissance(resultat.getDate("birthday"));
utilisateurTrouve.setCode(resultat.getString("userCode"));
utilisateurTrouve.setNomComplet(resultat.getString("userName"));
utilisateurTrouve.setMotDePasse(resultat.getString("userPassword"));
utilisateurTrouve.setRoleUtilisateur(resultat.getString("userRole"));
utilisateurTrouve.setCreeParId(resultat.getInt("createdBy"));
utilisateurTrouve.setDateCreation(resultat.getDate("creationDate"));
utilisateurTrouve.setModifieParId(resultat.getInt("modifyBy"));
utilisateurTrouve.setDateModification(resultat.getDate("modifyDate"));
utilisateurTrouve.setGenreId(resultat.getInt("gender"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
GestionBaseDonnees.FermerRessources(connexion, declaration, resultat);
}
return utilisateurTrouve;
}
}
Couche Servlet : Contrôle des requêtes
package com.example.auth.web;
import com.example.auth.model.Utilisateur;
import com.example.auth.service.ServiceAuthentification;
import com.example.auth.service.ServiceAuthentificationImpl;
import com.example.auth.util.ConstantesApplication;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ServletAuthentification extends HttpServlet {
private static final long serialVersionUID = 987654321L;
@Override
protected void doGet(HttpServletRequest requete, HttpServletResponse reponse) throws ServletException, IOException {
String codeUtilisateur = requete.getParameter("codeUtilisateur");
String motDePasseSaisi = requete.getParameter("motDePasse");
ServiceAuthentification serviceAuth = new ServiceAuthentificationImpl();
Utilisateur utilisateur = serviceAuth.authentifierUtilisateur(codeUtilisateur);
if (utilisateur == null) {
reponse.sendRedirect("/application-web/echec.jsp");
} else if (utilisateur.getMotDePasse().equals(motDePasseSaisi)) {
requete.getSession().setAttribute(ConstantesApplication.CLE_SESSION_UTILISATEUR, utilisateur);
reponse.sendRedirect("/application-web/tableau-bord.jsp");
} else {
reponse.sendRedirect("/application-web/echec.jsp");
}
}
@Override
protected void doPost(HttpServletRequest requete, HttpServletResponse reponse) throws ServletException, IOException {
doGet(requete, reponse);
}
}
Classe utilitaire de constantes
package com.example.auth.util;
public class ConstantesApplication {
public static final String CLE_SESSION_UTILISATEUR = "utilisateurConnecte";
}
Configuration du servlet dans web.xml
<servlet>
<servlet-name>authentificationServlet</servlet-name>
<servlet-class>com.example.auth.web.ServletAuthentification</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>authentificationServlet</servlet-name>
<url-pattern>/connexion.do</url-pattern>
</servlet-mapping>