正在实现一个用户自助修改密码的功能,请问如何做到用户在一个终端修改了密码,在所有终端退出登录(销毁session)?求指教
补充:目前使用的是redis+webman自带的 session() 处理用户状态,key只有session id 没有 uid,难点在于如何确定登录了这同一个账号的所有会话。
删掉session 客户端下次请求不都自己退出登录了吗?
看你的session有无入库呀,或者有长链接推送?
做了点补充
那你这入库的姿势就要改啊,唯一用户id为key来映射你的多个token,改完密码后删除这个用户id的数据就ok了呗
ok
修改密码时间存缓存或数据库里面,检查session里面的用户的密码修改时间,不一样就自动退出。
这个思路不错
设置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,不存在就转到登录页面。
谢谢
删掉session 客户端下次请求不都自己退出登录了吗?
看你的session有无入库呀,或者有长链接推送?
做了点补充
那你这入库的姿势就要改啊,唯一用户id为key来映射你的多个token,改完密码后删除这个用户id的数据就ok了呗
ok
修改密码时间存缓存或数据库里面,检查session里面的用户的密码修改时间,不一样就自动退出。
这个思路不错
设置session的时候自定义session名称,下面是我用的。
根据需要我封装了uuid函数和加密类。
修改密码时调用AdminAuth的clearLogin,修改成功后跳转到指定页面,也可以直接刷新当前页面,在中间件检查session,不存在就转到登录页面。
谢谢