修改密码如何同时销毁同一用户的所有session

fgt1t5y

问题描述

正在实现一个用户自助修改密码的功能,请问如何做到用户在一个终端修改了密码,在所有终端退出登录(销毁session)?求指教

补充:目前使用的是redis+webman自带的 session() 处理用户状态,key只有session id 没有 uid,难点在于如何确定登录了这同一个账号的所有会话。

截图

452 5 0
5个回答

TM

删掉session 客户端下次请求不都自己退出登录了吗?

  • 暂无评论
rbb

看你的session有无入库呀,或者有长链接推送?

  • 暂无评论
fgt1t5y

做了点补充

  • rbb 2023-12-13

    那你这入库的姿势就要改啊,唯一用户id为key来映射你的多个token,改完密码后删除这个用户id的数据就ok了呗

  • fgt1t5y 2023-12-13

    ok

ichynul

修改密码时间存缓存或数据库里面,检查session里面的用户的密码修改时间,不一样就自动退出。

weplus

设置session的时候自定义session名称,下面是我用的。
根据需要我封装了uuid函数和加密类。

<?php
declare(strict_types=1);

namespace platform\service;

use platform\extend\Code;
use platform\model\Account;

class AdminAuth
{
    /**
     * 账号Session名称
     *
     * @var string
     */
    protected string $account_session = 'account_session';

    /**
     * 用于解密的key
     * @var string
     */
    protected string $account_key = 'account_key';

    /**
     * 构造方法
     *
     * @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');
    }

    /**
     * 设置登录
     *
     * @param mixed $admin Builder|Model|object
     * @return void
     */
    public function setLogin(mixed $admin): void
    {
        // 登录时间
        $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 . ',欢迎回来!', $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);
    }

    // 权限判断等其他代码...
}

修改密码时调用AdminAuth的clearLogin,修改成功后跳转到指定页面,也可以直接刷新当前页面,在中间件检查session,不存在就转到登录页面。

🔝