直接删除 sessions 表中 user_id 等于目标用户 ID 的所有记录即可实现强制登出,前提是使用 database session 驱动、user_id 字段已填充且存在对应记录,删后用户下次请求时因凭证失效而登出。
直接删 sessions 表里对应用户的记录就行
laravel 的 session 默认存数据库时,每条记录靠 id 字段(即 session_id)唯一标识,user_id 字段(如果启用了用户绑定)会关联到 users 表。强行注销某个用户,本质就是删掉所有 user_id 等于该用户 id 的行。
注意:这仅在使用 database session driver 时有效;用 redis 或 file 驱动时不走这张表,不能这么操作。
- 确认当前 session 驱动是
database:检查config/session.php中的driver值 -
user_id字段必须存在且已填充——Laravel 只有在用户登录后调用Auth::login()且 session 配置了user_id写入逻辑(默认启用)才会写入 - 别只删一条:一个用户可能同时有多个活跃 session(比如多设备登录),要
DELETE FROM sessions WHERE user_id = ?
执行 SQL 前先查清楚有没有匹配记录
盲目删库风险高,尤其生产环境。先用 SELECT 确认目标是否存在、数量是否合理,避免误删或删漏。
示例(假设用户 ID 是 123):
SELECT id, user_id, ip_address, user_agent, last_activity FROM sessions WHERE user_id = 123;
常见问题:
- 查不到记录?可能是用户没登录过、session 过期被清理、或驱动不是
database -
user_id为NULL?说明该 session 未关联用户(比如游客访问),无法按用户维度注销 -
last_activity时间很旧?说明 session 已过期,删不删影响不大,但建议一并清理
Laravel 代码里安全删 session 记录
比起手写 SQL,用 Eloquent 更可控,也能复用模型事件和软删除逻辑(如果开启了)。
前提是已配置好 Session 模型(Laravel 9+ 自带 Illuminate\Session\Store 不直接映射模型,需手动建):
- 推荐做法:创建
App\Models\Session模型,关联sessions表,设置$table = 'sessions' - 执行删除:
Session::where('user_id', 123)->delete() - 如果担心并发写入,加事务:
DB::transaction(fn() => Session::where('user_id', 123)->delete()) - 不要用
Session::where('user_id', 123)->get()->each->delete()——会触发 N+1 次查询,性能差
删完 session 后用户不一定立刻登出
删除数据库记录只是“废掉凭证”,但用户浏览器里的 laravel_session Cookie 还在,下次请求仍会携带旧 session_id。Laravel 在中间件里查不到对应记录,会自动初始化新 session,原登录态就断了——但这个过程不是实时广播式的。
所以实际表现是:
- 用户刷新页面或发起新请求时,才感知到已登出(跳转到登录页或返回 401)
- 如果用户正停留在某个长连接页面(如 WebSocket、SSE),不会自动中断,得前端配合检测状态
- 没有“踢下线”通知机制,Laravel 本身不推送事件给客户端
真正要实现强同步登出,得额外加方案:比如结合 Redis 发布订阅、或在每次请求时检查 user_id 是否被标记为“强制登出”,但这已经超出单纯删 sessions 表的范围了。











