You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8 使用 Sanctum 实现修改密码后强制用户登出其他设备方案求助

Laravel 8 + Sanctum 修改用户密码后凭证即时失效实现方案

1. 核心逻辑说明

Sanctum的两类认证凭证(API Token、SPA Session)都和用户ID直接绑定,只需要在管理员修改客户密码的操作节点,清除对应用户的有效认证凭证,即可实现旧凭证即时失效。

2. 分场景实现代码

场景1:使用Sanctum API Token认证

该场景下有效token存储在personal_access_tokens表中,密码修改完成后直接删除对应用户的所有token即可:

// 管理员修改客户密码的逻辑
$customer = User::find($customerId);
$customer->password = Hash::make($newPassword);
$customer->save();

// 追加这一行即可删除该客户所有生效的API Token
$customer->tokens()->delete();

执行后客户携带旧token发起的所有请求都会返回401未认证,必须重新登录获取新token。

场景2:使用Sanctum SPA Session认证

该场景下依赖Session存储认证状态,需要提前开启会话认证中间件:

  1. 先确认app/Http/Kernel.php的web中间件组已经注册以下中间件:
\Illuminate\Session\Middleware\AuthenticateSession::class,
  1. 密码修改完成后调用Laravel内置方法清除其他会话:
// 密码更新保存后执行
Auth::logoutOtherDevices($newPassword);

该方法会使该用户除当前操作会话外的所有会话直接失效,客户刷新页面或发起新请求时会被判定为未登录。

3. 高并发场景可选优化方案

如果不想每次修改密码都批量删除token,可以用时间戳比对的方式减少数据库操作:

  1. 给users表新增password_updated_at timestamp字段,每次修改密码时同步更新该字段值为当前时间
  2. 自定义Sanctum认证中间件,每次请求校验token时比对时间:
public function handle($request, Closure $next)
{
    $user = Auth::guard('sanctum')->user();
    // 若token创建时间早于密码最近修改时间,直接判定凭证失效
    if ($user && $user->currentAccessToken()->created_at < $user->password_updated_at) {
        Auth::guard('sanctum')->logout();
        return response()->json(['message' => '凭证已过期,请重新登录'], 401);
    }
    return $next($request);
}
  1. 将自定义中间件注册到API路由组,替换原有Sanctum认证中间件即可。

4. 前端适配

前端统一拦截全局请求的401状态码,收到响应后清除本地存储的token、用户信息等缓存,直接跳转至登录页即可。

内容的提问来源于stack exchange,提问作者jabir145

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:57:04