ホームページ >バックエンド開発 >PHPチュートリアル >PHPユーザーのログイン制限の実装
Duomai 問い合わせ管理システムの開発プロセス中に、次の質問がありました。情報セキュリティのため、システムにアクセスできるすべての人にアカウントを提供したいと考えています。全員がアカウントを共有しているわけではなく、同時にアカウントにログインできるのは 1 人だけです。最初のアプローチは、ユーザーがログインした後、ユーザーがオフラインでないときに再度ログインしようとすると、ログインを禁止します。これにより、複数のユーザーが 1 つのアカウントで同時にログインする問題は解決されますが、実際の運用では、ログイン処理中にユーザーがロックした場合、終了時にロックを解除する必要があるという、より大きな問題が発生します。多くのユーザーはブラウザの閉じるボタンを直接クリックして Web サイトを離れるため、ロックを解除できなくなり、最終的にユーザーの通常のログインが制限されてしまいます。
それでは、ユーザー アカウントのログインをフレンドリーな方法で制限するにはどうすればよいでしょうか?まず、PHP がユーザーがログインしているかどうかをどのように識別するかを分析してみましょう。 HTTP プロトコルのステートレスな性質により、HTTP プロトコルを通じてユーザーを識別することはできません。一般に、ユーザーは主に Cookie またはセッションを通じて識別されます。これらの最大の違いは、リクエストがサーバーに送信されるたびに、クライアントは有効な Cookie をリクエストとともにサーバーに送信することです。セッション データはサーバーによって保存され、サーバーはクライアントから送信された特定の Cookie 値に基づいて、これらのリクエストが同じリクエストに属しているかどうかを判断できます。次のようなユーザーに対してログイン検出を実行します。
<?phpsession_start();if(isset($_SESSION['login']) && $_SESSION['login'] == true){ echo "登陆成功!";}if(isset($_POST['uname']) && isset($_POST['password'])){$uname = $_POST['uname'];$pass = $_POST['password'];if($uname == "admin" && $pass == "admin"){ $_SESSION['login'] = true; echo "登陆成功!";}else{ echo "用户名或密码错误!";}}?><form action="" method="post"><input type="text" name="uname"><input type="password" name="password"><input type="submit"></form>
明らかに、上記のコードは、1 人のユーザーが同時に 1 回しかログインできないことを保証しません。単一アカウントのログイン制限の 1 つ目の方法は、ログイン時にこのセッションのセッション ID を保存することです。ユーザーがログインするときに、最初に前のユーザーのセッション ID を削除してから、このログインのセッションを保存します。 、元のユーザーは新しいユーザーによってオフラインにされます:
<?phpdefine("session_path",dirname(__FILE__)."/session"); //设置session存放的目录session_save_path(session_path);session_start();if(isset($_SESSION['login']) && $_SESSION['login'] == true){ echo "登陆成功!";}if(isset($_POST['uname']) && isset($_POST['password'])){ $uname = $_POST['uname']; $pass = $_POST['password']; if($uname == "admin" && $pass == "admin"){ $_SESSION['login'] = true; kick_user(); echo "登陆成功!"; }else{ echo "用户名或密码错误!"; }}function kick_user(){ $last_login_session_id = file_get_contents("loginsession.txt");//获取上次登陆的session id,实际项目中最好存放在数据库中 $last_login_session_file = session_path."/sess_".$last_login_session_id;//获取session文件名 if(session_id()!= $last_login_session_id){ unlink($last_login_session_file); file_put_contents("loginsession.txt",session_id()); }}?><form action="" method="post"><input type="text" name="uname"><input type="password" name="password"><input type="submit"></form>
これに基づいて、単一ユーザーの同時ログイン数を制限できます。以下のように、kick_user 関数を変更するだけです。 🎜>
function kick_user($num=1){ $last_login_session_id_file = file_get_contents("loginsession.txt"); //获取上次登陆的session id $last_login_session_id_arr = explode("|",$last_login_session_id_file); if(!in_array(session_id(),$last_login_session_id_arr)){ array_push($last_login_session_id_arr,session_id()); } if(count($last_login_session_id_arr) > $num) { $rmsession = array_shift($last_login_session_id_arr); } if(isset($rmsession)){unlink(session_path."/sess_".$rmsession);} file_put_contents("loginsession.txt",implode("|",$last_login_session_id_arr));}