0

自分のサイトへのログインを作成しました。ユーザーがログインした後、ユーザーIDとアクション(=ログイン)をデータベースと$ _SESSION ['loggedin']==TRUEに保存します。(ログアウトすると、DBのアクションはログアウトされ、セッションは破棄されます)誰かが別のコンピューターから同じユーザー名で再度ログインしたい場合、データベースの最後の行が「ログイン」であるため、許可しません。もちろん、ユーザーIDも同じになります。したがって、1つのユーザー名からの複数の接続を許可したくありません。ここに、「他の接続を切断する」というリンクを配置します。

例:学校にログインしましたが、ログアウトを忘れた後、自宅でログインしようとしましたが、別の場所でログインしている(セッションが有効である)ため失敗します。[他の接続を切断する]リンクをクリックすると、学校のセッション値を削除したい(ログアウトに変更した場合、セッションはまだ有効であり、複数の接続が利用可能になるため、DBのアクション値を変更するだけでは不十分です)

1つのユーザー名からの複数の接続を防ぐにはどうすればよいですか?

4

2 に答える 2

1

アカウントがログインするたびに数字を 1 ずつ上げるなど、個々の接続を識別するために何かを保存する必要があるように思えます。

たとえば、ID が 1 のユーザーでログインするとします。ログインするのは 5 回目なので、これを DB に保存します: UserID=1, State="Logged In", ConnectionID=5 保存したセッションに: $_SESSION['loggedin']=TRUE および $_SESSION['ConnectionID']=5

次回ログインするときに、ログアウトされていないそのアカウントの接続があるかどうかを確認します。その場合は、既存の行を更新して状態をログアウトに設定するか、時間を記録する必要があります。状態がログアウト (UserID=1、State="Logged Out"、ConnectionID=5) の新しいエントリ。もちろん、新しい接続である接続 6 の行も挿入します。

その後、おそらくページが読み込まれるたびに、$_SESSION に保存したものと同じ ConnectionID を持つ行がデータベースにあるかどうかを確認するコードをサイトに配置するだけで済みます。ログアウトとして設定されたアクション。その場合、以前の接続をログアウトするセッションを破棄します。

うまくいけば、これにより、これを行う方法についての良いアイデアが得られます。他のオプションもあると確信しています。

アカウントが 1 つの場所からのみログインしていることのみを気にし、ログアウトしたときのログ記録には関心がない場合は、UserID と ConnectionID をデータベースに保存してから、データベース内の ConnectionID を確認するだけです。セッション内のものと同じです。そうでない場合は、セッションを強制終了します。

于 2012-10-28T16:23:52.547 に答える
0

信頼性の低い唯一の方法はIPアドレスをチェックすることであり、ユーザーがNATゲートウェイ(セルラーデータ接続、ホームルーターなど)の背後にいる場合、これはひどく失敗します。最善の策は、ユーザーが以前に開いていたセッションを実行して再度ログインシーケンスを実行した場合は、既存のセッションを削除することです。の線に沿って何か

login.php:

<?

check_password_stuff();

if (user_is_already_logged_in()) {
   delete_login();
}
do_login_stuff();
于 2012-10-28T16:20:40.903 に答える