QQ が別の場所からログインすると、比較的高いセキュリティ要件が要求される Web サイト、特にバックエンド管理では、アカウントが盗まれていないか、または別の人がログインしていないかを確認する必要がある場合があります。バックグラウンド操作を実行するのは非常に危険です。2 人が同時にログインして操作できないようにするために、アカウントを強制的にオフラインにすることができます。
もちろん、IPは特定のネットワークセグメント内でいつでも変わるため、IPで判断することはできませんが、同じブラウザを使用している限り、この問題を解決できるメカニズムがあります。それがセッションです。 Web サイトにアクセスする場合、ブラウザーは変更されず、各訪問者の session_id は変更されません。これはまさにこの問題を解決するために必要なことです。
TP フレームワークによって構築された Web サイトのバックエンドを例に挙げます。アイデアは次のとおりです:
(1) データベース ユーザー テーブル
ユーザー テーブルに、フィールド `session_id` varchar(32) を追加します。
、ログイン後に session_id を保存するために使用されます。 `session_id` varchar(32)
,用来存放登录之后的session_id。
(2)用户登录
用户登录,就是正常的判断账号密码以及验证码,当这些都验证通过的时候,取出当前的session_id存入数据库user表中。
M('user')->where(array('id'=>$_SESSION['uid']))->save(array('session_id'=>session_id()));
(3)解决异地登录问题
对于后台操作,为了便于验证和操作安全,基本都会先创建一个基础控制器BaseController,然后后台的其他操作控制器都继承这个基础控制器。对于后台的每一步操作之前,用户状态的检测都放在BaseController控制器的初始化_initialize()
方法中。
现在在_initialize()
(2) ユーザーログイン
ユーザーログインは、通常、アカウントのパスワードと認証コードを判定し、これらが認証されると、現在の session_id が取得され、データベースのユーザーテーブルに保存されます。
$user = M('user')->where(array('id'=>$_SESSION['uid']))->find(); $session_id = session_id(); if($user['session_id'] != $session_id){ session_destroy(); $this->error('您的账号在其他地方登录,您已经被强制下线', U('login')); }
バックグラウンド操作では、検証と操作セキュリティを容易にするために、基本的にベースコントローラーBaseControllerが最初に作成され、その後バックグラウンドの他の操作コントローラーが継承されます。この基本制御装置。バックグラウンド操作の各ステップの前に、ユーザー ステータスの検出が BaseController コントローラーの初期化 _initialize()
メソッドに配置されます。
ここで、_initialize()
メソッドでは、ユーザーのログイン状態がロックされているかどうかなどを確認することに加えて、ローカルの session_id を取り出して、ユーザー テーブルに格納されている session_id と比較する必要があります。一致しない場合は、テーブル名のアカウントが別の場所にログインしているため、強制的にオフラインにしてログイン ページに戻ることができます。
以上がユーザーのリモートログインリマインダー機能を実装するための PHP コード共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。