ホームページ バックエンド開発 PHPチュートリアル PHPユーザーのログイン制限の実装

PHPユーザーのログイン制限の実装

Jun 20, 2016 pm 12:31 PM

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));}
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

11ベストPHP URLショートナースクリプト(無料およびプレミアム) 11ベストPHP URLショートナースクリプト(無料およびプレミアム) Mar 03, 2025 am 10:49 AM

11ベストPHP URLショートナースクリプト(無料およびプレミアム)

Instagram APIの紹介 Instagram APIの紹介 Mar 02, 2025 am 09:32 AM

Instagram APIの紹介

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelでフラッシュセッションデータを使用します

LaravelのバックエンドでReactアプリを構築する:パート2、React LaravelのバックエンドでReactアプリを構築する:パート2、React Mar 04, 2025 am 09:33 AM

LaravelのバックエンドでReactアプリを構築する:パート2、React

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelテストでの簡略化されたHTTP応答のモッキング

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPのカール:REST APIでPHPカール拡張機能を使用する方法

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

Codecanyonで12の最高のPHPチャットスクリプト

Laravelの通知 Laravelの通知 Mar 04, 2025 am 09:22 AM

Laravelの通知

See all articles