Comment suivre les tentatives de connexion à l'aide de HttpSession en Java?
J'ai un no-cadre de l'application web. J'ai besoin de mettre en œuvre un moyen simple pour vérifier échec des connexions, à l'aide de sessions. Si l'utilisateur tente de se connecter 3 fois à l'aide incorrecte nom d'utilisateur/mot de passe, ils seront donnés à 20 minutes délai d'attente avant de pouvoir vous connecter à nouveau.
Actuellement j'ai seulement mis une session utilisateur si l'utilisateur se connecte avec succès dans le système. Cependant, il semble que je devrais obtenir une session en cas d'échec de la connexion aussi, et de compter les tentatives de connexion en quelque sorte.
De connexion.jsp (version simplifiée):
<form name="loginForm" method="post" action="CustomerData">
User name:<input type="text" name="userName"/>
Password:<input type="password" name="password"/>
<input type="button" value="submit">
CustomerData.java (version simplifiée):
//See if customer is a valid user
String selectQuery = "Select firstName,lastName,email from customer where userName='"+userName+"' and password='"+password+"'";
selectResult = statement.executeQuery(selectQuery);
if(selectResult.next())
{
//We got a valid user, let's log them in
....
HttpSession session = request.getSession(true);
session.setAttribute("customer", customer);
}
else
{
//this is where I need to get the session id (??),
//count the unsuccessful login attempts somehow,
//and give them a 20 minutes timeout before they can try logging in again.
request.setAttribute("message","Invalid username or password. Please try again!");
}
En faisant des recherches, j'ai trouvé qu'il y a beaucoup de fonctions de sécurité intégrées pour diverses Java cadres. J'ai aussi trouvé que l'utilisation de sessions n'est pas la meilleure façon de suivre les tentatives de connexion, car l'utilisateur peut se connecter avec les différents navigateurs. Cependant, je suis à la création de cette fonctionnalité pour un projet web simple qui ne sera jamais à aller à n'importe quel environnement de production. Je voudrais savoir comment mettre en place cette fonctionnalité à l'aide de Java Objet HTTPSession.
Ok, voici ma solution complète, basée sur les commentaires que j'ai reçu. Je poste dans ce cas, il peut aider d'autres personnes avec des problèmes similaires:
//See if customer is a valid user
String selectQuery = "Select firstName,lastName,email from customer where userName='"+userName+"' and password='"+password+"'";
selectResult = statement.executeQuery(selectQuery);
if(selectResult.next())
{
//We got a valid user, let's log them in
Customer customer = new Customer();
customer.setFirstName(selectResult.getString("firstName"));
customer.setLastName(selectResult.getString("lastName"));
customer.setEmail(selectResult.getString("email"));
customer.setUserName(userName);
customer.setPassword(password);
//establish a user session
session.setAttribute("customer", customer);
session.setAttribute("firstName", customer.getFristName());
url = "/index.jsp";
selectResult.close();
}
else
{
int loginAttempt;
if (session.getAttribute("loginCount") == null)
{
session.setAttribute("loginCount", 0);
loginAttempt = 0;
}
else
{
loginAttempt = (Integer) session.getAttribute("loginCount");
}
//this is 3 attempt counting from 0,1,2
if (loginAttempt >= 2 )
{
long lastAccessedTime = session.getLastAccessedTime();
date = new Date();
long currentTime = date.getTime();
long timeDiff = currentTime - lastAccessedTime;
//20 minutes in milliseconds
if (timeDiff >= 1200000)
{
//invalidate user session, so they can try again
session.invalidate();
}
else
{
//Error message
session.setAttribute("message","You have exceeded the 3 failed login attempt. Please try loggin in in 20 minutes, or call our customer service center at 1-800 555-1212.");
}
}
else
{
loginAttempt++;
int allowLogin = 3-loginAttempt;
session.setAttribute("message","loginAttempt= "+loginAttempt+". Invalid username or password. You have "+allowLogin+" attempts remaining. Please try again! <br>Not a registered cusomer? Please <a href=\"register.jsp\">register</a>!");
}
session.setAttribute("loginCount",loginAttempt);
url = "/login.jsp";
}
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url);
dispatcher.forward(request, response);
OriginalL'auteur Marta | 2012-12-04
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer le code ci-dessous
Je l'ai dit ici, et si je veux compter le nombre de tentatives de l'utilisateur pour les demandes de connexion.
Vous pouvez utiliser
session.getLastAccessedTime()
et de les comparer en temps avec le système actuel, le temps pour l'intervalle de validationSuper, je vais le faire. Merci!!!!
Cette "solution" n'est pas assez robuste. Les pirates peuvent encore contourner cela simplement ne pas envoyer le cookie de session qui apparaît ainsi comme une nouvelle session sur le serveur de côté à chaque fois.
OriginalL'auteur Bhavik Ambani