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存储认证状态,需要提前开启会话认证中间件:
- 先确认
app/Http/Kernel.php的web中间件组已经注册以下中间件:
\Illuminate\Session\Middleware\AuthenticateSession::class,
- 密码修改完成后调用Laravel内置方法清除其他会话:
// 密码更新保存后执行 Auth::logoutOtherDevices($newPassword);
该方法会使该用户除当前操作会话外的所有会话直接失效,客户刷新页面或发起新请求时会被判定为未登录。
3. 高并发场景可选优化方案
如果不想每次修改密码都批量删除token,可以用时间戳比对的方式减少数据库操作:
- 给
users表新增password_updated_attimestamp字段,每次修改密码时同步更新该字段值为当前时间 - 自定义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); }
- 将自定义中间件注册到API路由组,替换原有Sanctum认证中间件即可。
4. 前端适配
前端统一拦截全局请求的401状态码,收到响应后清除本地存储的token、用户信息等缓存,直接跳转至登录页即可。
内容的提问来源于stack exchange,提问作者jabir145
相关产品推荐
相关产品推荐

