Empêcher la connexion multiple en utilisant le même nom d'utilisateur et le même mot de passe
Je développe une application qui doit éviter de se connecter plusieurs fois en utilisant le même nom d'utilisateur et mot de passe.
Si il se passe sur la même machine, alors évidemment, nous avons besoin de faire quelque chose avec la session de l'utilisateur, mais il faut aussi prévenir si ils sont la connexion sur des machines différentes en utilisant le même nom d'utilisateur et mot de passe.
Nous devons garder les choses suivantes à l'esprit:
- Si l'utilisateur ferme le navigateur sans vous déconnecter.
- Si le temps de session.
Je vous serais reconnaissant de toute aide sur ce.
source d'informationauteur vivmal
Vous devez vous connecter pour publier un commentaire.
En particulier ce cas est difficile et pas fiable pour détecter. Vous pouvez utiliser le
beforeunload
des événements en Javascript, mais vous êtes entièrement dépendant si le navigateur a JS activé et le navigateur prend en charge ce non-événement standard (par exemple, l'Opéra n'est pas). C'est aussi l'une des raisons principales que je te suggère juste de déconnexion précédemment enregistrés l'utilisateur au lieu de prévenir la connexion. C'est aussi plus convivial et sécurisé pour le cas où l'utilisateur a "oublié" de vous déconnecter à partir de l'autre ordinateur.Façon la plus simple est de laisser le
User
ont unstatic Map<User, HttpSession>
variable et de le laisser mettre en œuvreHttpSessionBindingListener
(et#equals()
et#hashCode()
).Lorsque vous vous connectez la
User
comme suit:alors qu'il invoquera le
valueBound()
qui permettra d'éliminer tout utilisateur connecté à partir de lalogins
carte et d'annuler la session.Lorsque vous vous déconnectez le
User
comme suit:ou lorsque la session est expirée, puis le
valueUnbound()
sera appelé qui supprime l'utilisateur dulogins
carte.Créer une table dans votre base de données — appelons
[online_users]
— avec trois champs:Chaque fois qu'un utilisateur se connecte, insérer le nom de l'utilisateur et du temps de connexion en
[online_users]
.Sur toutes les pages qui demandent aux utilisateurs de se connecter en place cette condition: vérifier
[online_users]
pour voir si l'utilisateurlogout_time
est vide ou pas.Chaque fois qu'un utilisateur appuie sur un bouton de déconnexion, définir la
logout_time
dans[online_users]
pour que le nom de l'utilisateur.Si quelqu'un essaie d'ouvrir une session avec un nom d'utilisateur et le mot de passe, vérifiez
username
etlogout_time
et afficher un message indiquant que l'utilisateur est déjà connecté. Et, surtout, de définirlogout_time
àMULTIPLELOGIN
pour cet utilisateur.Que si l'utilisateur est connecté sur une autre machine, puis si il actualise ou accède à une autre page du site lui dire qu'il a été déconnecté. Ensuite, l'utilisateur peut être redirigé vers la page d'accueil du site.
Prendre un champ supplémentaire dans le tableau avec le nom de la colonne dire "IsLoggedIn" comme champ de bits et de le définir à vrai jusqu'à ce que l'utilisateur est connecté. Dès que l'utilisateur se déconnecte définie sur false.
Ce besoin d'être fait pour la session d'expiration du temps aussi.
Dès que la session expire, ce champ doit être défini sur false automatiquement à l'aide de déclencheurs ou thru SP appel
bonne solution est toujours la bienvenue
Je conseille pour Shantanu Gupta solution - avoir une base de données de la colonne indiquant à l'utilisateur actuellement connecté, et la mise à jour de colonne en conséquence.
Afin de "capturer" expiration de session, vous devez définir dans votre
web.xml
:Où
MySessionListener
est votre mise en œuvre de laHttpSessionListener
interface (fourni par la Servlet API).Je voudrais simplement suggérer à l'aide d'un cadre de sécurité pour gérer tous ces détails pour vous. Printemps De Sécuritépar exemple, est assez facile à intégrer dans un projet existant, peut être adapté très fortement si besoin est - et le plus important, il a un support intégré pour la détection et le contrôle de connexions simultanées.
Ne pas réinventer la roue quand il n'est pas nécessaire, sinon vous allez passer un bon peu de temps pour créer un cahoteuse de la roue.
Peut-être trop simplifié, mais bon... ça marche pour moi dans Web2Py:
Seulement sur la connexion réussie, je suis en train d'écrire l'id de session (la réponse.session_id) dans le auth_membership table.
Sur la landing page (page d'index) je vérifie si la réponse actuelle.session_id est égale à l'id de session à venir à partir de la DB.
Si oui, - les tous.
Si ce n'est pas (le "vieux" , d'abord de l'utilisateur) est poliment déconnecté.
Ci-dessus fonctionne, puisque à chaque connexion une NOUVELLE réponse.session_id est créé et stocké dans la base de données.
La vérification se fait uniquement sur la page de destination (ce qui, dans mon application est le plus important, en initiant de nombreuses autres fonctions), donc pas trop de DB hits pour la ci-dessus.
Le ci-dessus ne dépend pas de la connexion de l'utilisateur.
Aucune adresse IP n'est impliqué (que d'autres l'ont mentionné, souffre de ses propres problèmes)
Il permet à UN seul utilisateur d'être connecté à un moment et il se déconnecte les "anciens" de l'utilisateur.
J'espère que ça aide
NeoToren
Vous pouvez stocker une sorte de session-id de l'utilisateur lors de la connexion. Lorsque l'utilisateur se déconnecte ou que la session expire, vous supprimez les données de nouveau.
Lorsqu'un utilisateur essaie de se connecter, et vous avez déjà un identifiant la session stockées pour cet utilisateur, permettent à l'utilisateur de confirmer que, et puis invalider l'ancienne session.
Un utilisateur voudra certainement se connecter à nouveau immédiatement si le navigateur s'est écrasé ou quelque chose comme ça, donc, permettant à l'utilisateur d'attendre la session expire pourrait être gênant.
Cela fait-il sens pour votre application?
J'avais suivi de chaque utilisateur de la dernière adresse IP connue et un horodatage de la dernière sur la propriété intellectuelle. Ensuite, vous pouvez simplement bloquer l'accès à partir d'autres IPs de 5 minutes, une heure, ou ce que vous voulez.
Chaque fois que l'adresse IP commutateurs, vous pouvez: a) expiration de l'utilisateur ancienne session, de sorte qu'ils sont obligés de se reconnecter et b) de l'incrément de l'utilisateur du compteur (que vous pouvez remettre à zéro toutes les heures). Si le compteur passe au-dessus de 5 (ou quelque chose), vous pouvez bloquer tous les accès au compte de l'utilisateur pour une plus longue période de temps.
Cela peut être facilement appliqué si vous avez de la session. Pour chaque navigateur de connexion, vous devez créer une session d'enregistrement en session DB. L'ID de session peut être utilisé comme cookie d'authentification. La session DB a aussi un index avec le nom d'utilisateur. Lors de la connexion, vous pouvez interroger la base de données pour vérifier combien de séances sont là. Nous permet en fait d'une session pour chaque type. Par exemple, l'utilisateur peut avoir une connexion de téléphone mobile et un autre à partir du navigateur. Mais il ne peut pas avoir 2 sessions de navigateur.
Pour résoudre le problème que vous avez mentionné. Vous avez 2 options,
Ont un très court délai d'expiration de session (5 minutes) et de prolonger la session à chaque utilisation. De cette façon, l'utilisateur sera automatiquement déconnecté si vous la laissez sans se déconnecter.
La bosse de l'autre session. La nouvelle session des bosses de l'ancienne session. La cognée la session reste en DB avec un drapeau spécial pour 24 heures. Nous affichons un message pour dire à l'utilisateur l'autre session est d'être frappé et affiche l'heure et la propriété intellectuelle. De cette façon, l'utilisateur doit être averti si leur compte est compromise.
J'ai mis en place une solution possible pour moi,
dans le loginFilter j'utilise, j'ai mis un lastloggedin, userloggedin et userSession dans l'enregistrement de l'utilisateur sur mon système.
quand je vais sur un de mes struts2 mesures que j'ai un bout de code dans la méthode préparer.
Cela permettra de déconnecter l'utilisateur lors de sa connexion sur une autre machine, ou si vous ne voulez pas vous connecter en j'ai pu effectuer les opérations suivantes sur le loginFilter