Servlet d'authentification avec Mysql

Fermé
drakerz - 9 déc. 2014 à 19:05
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 10 déc. 2014 à 20:42
Bonsoir à tous, je viens de créer une Servlet Login et une page JSP Login afin de permettre l'authentification des utilisateurs qui se sont enregistrés dans ma base de donnée. Le problème de ma Servlet c'est qu'elle ne permet l'authentification que de la dérniére personne s'étant inscrite ... et je ne comprend pas du tout pourquoi !

Et dans un deuxième temps j'aimerai changer la connexion de ma Servlet pour passer par mon fichier persistence.xml

Voici mes codes ! avez vous une idée de l'origine du probléme ?

Ma servlet Login :

package com.supmessaging.servlet;

import java.io.*;
import java.sql.*;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet(urlPatterns = "/Logintest")

public class Login extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;

private ServletConfig config;

public void init(ServletConfig config)
throws ServletException{
// this.config=config;
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{

PrintWriter out = response.getWriter();
// "configuration" de la connexion à la base de donnée
String connectionURL = "jdbc:mysql://localhost:3306/supmessaging";
Connection connection=null;
ResultSet rs;
//variable locale pour le username et le password
String usrnm=new String("");
String pswd=new String("");
response.setContentType("text/html");
try {
Class.forName("com.mysql.jdbc.Driver");
//Connexion à la base de données
connection = DriverManager.getConnection(connectionURL, "root", "");
// on récupére username et password dans la BDD







String sql = "SELECT username, password FROM users" ;
Statement s = connection.createStatement();
s.executeQuery (sql);
rs = s.getResultSet();
while (rs.next ()){
usrnm=rs.getString("username");
pswd=rs.getString("password");
}
rs.close ();
s.close ();
}catch(Exception e){
System.out.println("Exception is ;"+e);
}
//on compare les usernames et password entrer avec ceux de la ba BDD
if(usrnm.equals(request.getParameter("username")) && pswd.equals(request.getParameter("password"))){

request.getSession().setAttribute("username", usrnm);
out.println("login ok");

}
else{
out.println("login nok");
}
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
RequestDispatcher rd = req.getRequestDispatcher("/login.jsp");
rd.forward(req, resp);
}
}


Ma page JSP login :

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>SupMessaging by MLabs</title>
<link rel="stylesheet" href="./style.css" />
</head>

<body>
<%@ include file="header.jsp" %>

<!-- Main -->
<div id="main" class="main">
<form action="<%= request.getContextPath() %>/Logintest" method="post">
<h2>identifiez vous</h2>
<p>
Nom d'utilisateur :<br>
<input type="text" pattern=".{4,30}" name="username" placeholder="4 caractères minimum." size=30 required>
<br>

Mot de passe :<br>
<input type="password" pattern=".{8,40}" name="password" placeholder="8 caractères minimum." size=30 required>
<br>

<input type="submit" value="Soumettre">
</p>
</form>
</div>

<%@ include file="footer.jsp" %>
</body>
</html>


Ma page persistencexml :

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">

<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">


<properties>
<property name="hibernate.archive.autodetection" value="class" />
<property name="hibernate.format_sql" value="true" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/supmessaging" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update" />


</properties>
</persistence-unit>
</persistence>

1 réponse

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
9 déc. 2014 à 19:10
Bonjour,

J'ai pas tout regardé, je suis allé à l'essentiel, ton problème est là :

 while (rs.next ()){
  usrnm=rs.getString("username");
  pswd=rs.getString("password");
  }

À chaque tour de boucle tu écrases la valeur précédente donc tu n'as que le dernier.
0
Mmmh oui je comprend ! donc il suffirait simplement de supprimer ma boucle "tant que" ?
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
9 déc. 2014 à 19:49
Non, si tu supprimes ta boucle, tu n'auras que le premier...

Il faut d'abord réfléchir en terme de données, ça c'est absolument horrible :
SELECT username, password FROM users
  if(usrnm.equals(request.getParameter("username")) && pswd.equals(request.getParameter("password"))){

Puisque tu as le username en paramètre, filtre directement ta requête dessus, il ne reste alors plus qu'à comparer le mot de passe avec celui donné :
SELECT password FROM users WHERE username = ?
  if(pswd.equals(request.getParameter("password"))){

Ceci est beaucoup mieux car ta base de données n'aura pas à te renvoyer tous les users/mdp, elle te renverra juste un élément (ou aucun), et là dans ce cas tu pourras enlever ta boucle while.
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
9 déc. 2014 à 19:55
D'un point de vue organisationnel il faut absolument que tu découpes ton code, le Java EE c'est une architecture en couche, il est absolument exclus de mettre les accès en base de données au même endroit que l'accès réseau, normalement c'est totalement séparé.

Voici un schéma d'architecture Java EE :
Architecture J2EE
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
9 déc. 2014 à 20:04
Et pour ton problème de persistence.xml, vu ton niveau, il serait mieux de rester sur le JDBC de base, la JPA est complexe à mettre en place. Tout au plus, utilises un fichier .properties pour créer un un objet DataSource, mais ne va pas plus loin, c'est inutile.
0
Merci pour ton aide précieuse, je commence à mieux comprendre !

J'ai donc modifié mon code comme tu me la expliqué mais j'ai toujours le même problème...
Pourtant la condition "username = ?" devrait bien permettre de récupérer tout les mots de passe de la colonne ?

  

String sql = "SELECT password FROM users WHERE username = ?";
Statement s = connection.createStatement();
s.executeQuery (sql);
rs = s.getResultSet();
pswd=rs.getString("password");
rs.close ();
s.close ();
}catch(Exception e){
System.out.println("Exception is ;"+e);
}
if(pswd.equals(request.getParameter("password"))){

request.getSession().setAttribute("username", usrnm);
out.println("login ok");

}
else{
out.println("login nok");
}
}
0