> 백엔드 개발 > PHP 문제 > PHP에서 한 명의 사용자만 로그인하는 방법

PHP에서 한 명의 사용자만 로그인하는 방법

藏色散人
풀어 주다: 2023-03-17 16:36:01
원래의
5568명이 탐색했습니다.

PHP에서 한 명의 사용자만 로그인하는 방법: 1. uni-app 프런트엔드에서 소켓을 초기화합니다. 2. 실시간으로 "강제 종료" 유형 메시지를 받습니다. 3. PHP 백엔드를 사용하여 메시지를 받습니다. "장치 고유 식별" 매개변수 4. 캐시의 클라이언트 ID를 기반으로 메시지를 보냅니다.

PHP에서 한 명의 사용자만 로그인하는 방법

이 튜토리얼의 운영 환경: Windows 10 시스템, PHP 버전 8.1, Dell G3 컴퓨터.

PHP에서 한 명의 사용자만 로그인하는 방법은 무엇입니까?

uni-app은 PHP를 결합하여 단일 사용자 로그인을 구현합니다.

단일 사용자 로그인, 즉 애플리케이션에서 동일한 사용자는 온라인에서 한 번만 로그인할 수 있습니다. , 한 명의 사용자가 로그인할 수 있으면 다른 기기에서는 즉시 오프라인으로 푸시됩니다. 확인 후 기기에서 로그인 로드를 지우고 로그인 인터페이스로 돌아갑니다.

uni-app은 현재 vue.js 프레임워크를 사용하여 Android, IOS, WeChat 애플릿, Toutiao Alipay 애플릿 및 H5를 패키징할 수 있으며, HBuilder 도구를 사용하면 코드 세트만 작성하면 됩니다. 및 클라우드 패키징에 대해서는 CW.PUB(https://cw.pub/index/document/index)을 권장합니다. HBuilder를 사용하여 탈옥 패키지를 생성하고 해당 웹사이트에 서명하여 일반 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. 백엔드는 "장치 고유 식별" 매개변수를 수신하고 먼저 장치 식별 및 소켓을 기록하는 캐시가 존재하는지 확인합니다.

3. 로그인 인터페이스는 장치 식별을 수신하고, 식별 기록을 캐시 또는 라이브러리에서 검색하여 현재 수신된 장치 식별과 일치하지 않는지 확인합니다. 캐시의 클라이언트 ID입니다.

$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);
    }
로그인 후 복사

Push 단일 사용자 로그인 예제

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에 따라 캡슐화된 푸시 방식으로 유니캐스트, 브로드캐스트, 점핑 애플리케이션 활동, 점핑 웹페이지 연결 등이 포함됩니다.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP에서 한 명의 사용자만 로그인하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿