Implémentation d'une authentification utilisateur avec les couches Servlet, Service et DAO

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>

Étiquettes: Java Servlet JDBC MySQL DAO

Publié le 28 juin à 01h51