正在實(shí)現(xiàn)一個(gè)用戶自助修改密碼的功能,請(qǐng)問(wèn)如何做到用戶在一個(gè)終端修改了密碼,在所有終端退出登錄(銷(xiāo)毀session)?求指教
補(bǔ)充:目前使用的是redis+webman自帶的 session() 處理用戶狀態(tài),key只有session id 沒(méi)有 uid,難點(diǎn)在于如何確定登錄了這同一個(gè)賬號(hào)的所有會(huì)話。
設(shè)置session的時(shí)候自定義session名稱,下面是我用的。
根據(jù)需要我封裝了uuid函數(shù)和加密類。
<?php
declare(strict_types=1);
namespace platform\service;
use platform\extend\Code;
use platform\model\Account;
class AdminAuth
{
/**
* 賬號(hào)Session名稱
*
* @var string
*/
protected string $account_session = 'account_session';
/**
* 用于解密的key
* @var string
*/
protected string $account_key = 'account_key';
/**
* 構(gòu)造方法
*
* @access public
*/
public function __construct()
{
$this->account_session = uuid(4, false, request()->host() . 'account_session');
$this->account_key = uuid(4, false, request()->host() . 'account_key');
}
/**
* 設(shè)置登錄
*
* @param mixed $admin Builder|Model|object
* @return void
*/
public function setLogin(mixed $admin): void
{
// 登錄時(shí)間
$admin->login_at = date('Y-m-d H:i:s');
// 登錄IP地址
$admin->login_ip = request()->getRealIp();
$session = request()->session();
$admin->save();
$session->put(['tip' => $admin->account . ',歡迎回來(lái)!', $this->account_session => Code::encryption(json_encode($admin), $this->account_key)]);
}
/**
* 退出登錄
*
* @return bool
*/
public function clearLogin(): bool
{
$session = request()->session();
$session->forget($this->account_session);
return $session->has($this->account_session);
}
// 權(quán)限判斷等其他代碼...
}
修改密碼時(shí)調(diào)用AdminAuth的clearLogin,修改成功后跳轉(zhuǎn)到指定頁(yè)面,也可以直接刷新當(dāng)前頁(yè)面,在中間件檢查session,不存在就轉(zhuǎn)到登錄頁(yè)面。