ホームページ  >  記事  >  バックエンド開発  >  PHPで1ユーザーのみログインする方法

PHPで1ユーザーのみログインする方法

藏色散人
藏色散人オリジナル
2022-12-19 10:43:185539ブラウズ

php メソッドを使用して 1 ユーザーのみのログインを実現します: 1. uni-app フロントエンドでソケットを初期化します; 2. 「強制終了」タイプのメッセージをリアルタイムで受信します; 3. PHP バックエンドを使用して " device unique" "Identification" パラメータ; 4. キャッシュ内の clientid に従ってメッセージを送信します。

PHPで1ユーザーのみログインする方法

このチュートリアルの動作環境: Windows 10 システム、PHP バージョン 8.1、Dell G3 コンピューター。

php で 1 ユーザーのみログインする方法

uni-app は PHP を組み合わせて単一ユーザー ログインを実現します

シングル ユーザー ログイン。つまり、アプリケーションでは、同じユーザーはオンラインで 1 回しかログインできません。ユーザーがログインすると、他のデバイスではすぐにオフラインになります。確認後、デバイスにロードされているログインをクリアして、に戻ります。ログインインターフェイス。

uni-app は現在、vue.js フレームワークを使用して Android、IOS、WeChat アプレット、Toutiao Alipay アプレット、および H5 をパッケージ化することができ、一連のコードを記述するだけで済みます。HBuilder ツールを使用することで、デバッグやクラウドパッケージ化に便利です。Apple証明書に関しては、CW.PUB、https://cw.pub/index/document/indexを推奨します。 HBuilder を使用してジェイルブレイク パッケージを作成し、その Web サイトで署名して通常の Apple 携帯電話にインストールします。ただし、インターネット上には他の方法もありますが、ここではリストしません。

通常、APP はシングル ユーザー ログインにサードパーティのメッセージ プッシュ プラットフォームを使用しますが、uni-app は Umeng や Jiguang などのプッシュ プラットフォームに接続することもできます。しかし、まだ時間の関係で、ドッキングプラットフォームのレビューやその他のプロセスに時間がかかりません。以前インスタントチャットにgatewayworkmanとwebsocketを使っていたので、シングルユーザーログインもwebsocketを使って実装しました。

uni-app ソケットのシングルユーザー ログインの例

1. uni-app フロントエンドは、ソケットの初期化時に現在のデバイスの一意の識別子を送信します。 「リアルタイムで「強制終了」を受信する」タイプのメッセージは、単純な例にすぎません。

//初始化
socket.on('init', () => { //连接初始化
socket.send({
type: 'login',
token: uni.getStorageSync('access_token'),
device_no: plus.device.uuid,//手机设备唯一编号
});
}).on('quit_push',(res)=> {
if(res) {
uni.showModal({
title: '退出通知',
content: '你的账号在其他设备上登录!',
showCancel: true,
cancelText: '取消',
confirmText: '确定',
success: res => {
if(res.confirm) {
uni.clearStorageSync()
store.commit('chat/clear')
uni.reLaunch({
url:"../../pages/login/index"
})
}else if(res.cancel) {
uni.clearStorageSync()
store.commit('chat/clear')
uni.reLaunch({
url:"../../pages/login/index"
})
}
}
});
}
});

2. バックエンドは「デバイス固有の識別」パラメータを受け取り、最初にキャッシュが存在するかどうかを確認します。デバイスの識別とソケットを記録する clientid はありません。

3. ログイン インターフェイスはデバイス ID を受け取り、キャッシュまたはライブラリから取得した ID レコードが、現在受け取っているデバイス ID と一致するかどうかを判断します。一致しない場合は、メッセージはキャッシュ内の clientid に基づいて送信されます。

$is_online = Db::name('UserLoginClient')->where('user_id',$user['id'])->order('id desc')->find();
if(isset($device_no) && $device_no && $is_online['device_no'] != $device_no && !empty($is_online['device_no'])) { 
Tools::sendToClient($is_online['client_id'],json_encode([
'type' => 'quit_push',
'data' => 'ip',
'message' => '强制下线'
]));
}

4. ツール クラス sendToClient メソッドの一部

public static function sendToClient($client_id, $message)
    {
        Gateway::sendToClient($client_id, $message);
    }

プッシュ シングル ユーザー ログインの例

1. まず友人に接続しますフロントエンドとバックエンドを含むアライアンスは SDK を追加し、そのメソッドを使用しました。

2. メッセージ プッシュには、クライアントによって生成され、一意のデバイスを識別できる一意の値「トークン」(ここでは「プッシュトークン」と呼びます) があります。

3. バックエンドはログイン時にプッシュトークンを受け取り、プッシュトークンが存在するかどうかを判断し、存在しない場合はユーザーIDをキーとして保存します。

4. キャッシュが存在する場合はキャッシュとの整合性を判定し、整合性がある場合はキャッシュ時間を延長し、不整合の場合はメッセージを出力します。古いプッシュトークン (キャッシュ内) にプッシュされ、新しいプッシュトークンがキャッシュされます。

if (self::$headToken && Cache::has(self::$prefix . self::$userId)) {
            if (self::$headToken == Cache::get(self::$prefix . self::$userId)) {
                Cache::set(self::$prefix . self::$userId, self::$headToken, self::$timeOut);
            } else {        // 换了手机,客户端重新发送pushtoken到服务端,服务端与缓存中的pushtoken比较,不同则给原来pushtoken手机推送一条并重新缓存新的token
                // modify by wensen on 20180816
                // $addr = getCity();
                $addr = getMobCity();
                $ip = request()->ip();
                
                if ($addr) {
                    $addr['province'] = empty($addr['province']) ? '' : $addr['province'];
                    $addr['city'] = empty($addr['city']) ? '' : $addr['city'];
                    // $address = "\t" . $addr['country'] . "-" . $addr['region'] . "-" . $addr['city'] . " (IP:" . $ip . ")\t";
                    $address = "\t" . $addr['country'] . "-" . $addr['province'] . "-" . $addr['city'] . " (IP:" . $ip . ")\t";
                } else {
                    $address = "IP:" . $ip . "";
                }
                $OldToken = Cache::get(self::$prefix . self::$userId);
                if (strlen($OldToken) == 64) {
                    $content = array(
                        'title' => 'APP紧急通知',
                        'body' => '您的账号于:' . date('Y-m-d H:i:s') . '在' . $address . '处登录,若不为您本人登录,请您立即修改密码!',
                        'pull_service' => 'login'
                    );
                    \umeng\Push::send($OldToken, 'unicast', $content, 'message', true);
                } elseif (strlen($OldToken) == 44) {
                    $content = array(
                        'pull_service' => 'login',
                        'msg' => '您的账号于:' . date('Y-m-d H:i:s') . '在' . $address . '处登录,若不为您本人登录,请您立即修改密码!'
                    );
                    \umeng\Push::send($OldToken, 'unicast', $content, 'message', true);
                }
                Cache::set(self::$prefix . self::$userId, self::$headToken, self::$timeOut);
            }
        } else {
            Cache::set(self::$prefix . self::$userId, self::$headToken, self::$timeOut);
        }

5. APP クライアントはプッシュを受信し、ポップアップ プロンプトを実行して処理を終了します。

6. 上記は、Umeng の SDK に従ってカプセル化されたプッシュ メソッドで、ユニキャスト、ブロードキャスト、アプリケーション アクティビティへのジャンプ、Web ページ接続へのジャンプなどが含まれます。

推奨学習: 「PHP ビデオ チュートリアル

以上がPHPで1ユーザーのみログインする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。