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

Laravel Sanctum过期令牌未从personal_access_tokens表移除的处理咨询

处理Laravel Sanctum过期令牌留存的方案

针对Sanctum令牌过期后仍留存数据库的问题,以下是几种实用的解决方法:

方法一:自定义Artisan命令+定时任务(推荐)

通过创建清理命令并配合Laravel定时任务,定期自动清理所有过期令牌,适合全局维护场景。

  1. 生成自定义清理命令
    运行Artisan命令生成命令类:
php artisan make:command PruneExpiredSanctumTokens
  1. 编写清理逻辑
    打开生成的app/Console/Commands/PruneExpiredSanctumTokens.php,修改handle方法实现清理:
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Laravel\Sanctum\PersonalAccessToken;

class PruneExpiredSanctumTokens extends Command
{
    protected $signature = 'sanctum:prune-expired-tokens';
    protected $description = '清理数据库中过期的Sanctum令牌';

    public function handle()
    {
        $prunedCount = PersonalAccessToken::where('expires_at', '<=', now())->delete();

        $this->info("成功清理 {$prunedCount} 条过期Sanctum令牌。");
    }
}
  1. 配置定时任务
    在app/Console/Kernel.php的schedule方法中添加任务调度,根据需求设置执行频率:
protected function schedule(Schedule $schedule)
{
    // 每天凌晨1点执行清理
    $schedule->command('sanctum:prune-expired-tokens')->dailyAt('01:00');
    // 可选:每小时执行一次
    // $schedule->command('sanctum:prune-expired-tokens')->hourly();
}

注意:需确保服务器已配置crontab定时运行php artisan schedule:run,否则定时任务不会生效。

方法二:用户登录时清理自身过期令牌

如果不需要全局定时清理,可在用户登录逻辑中,顺带清理当前用户的过期令牌,避免单个用户的令牌数据冗余:

use Laravel\Sanctum\PersonalAccessToken;

public function login(Request $request)
{
    // 用户凭证验证逻辑...

    // 清理当前用户的过期令牌
    $request->user()->tokens()->where('expires_at', '<=', now())->delete();

    // 创建并返回新令牌
    $token = $request->user()->createToken('auth_token')->plainTextToken;

    return response()->json(['token' => $token]);
}

此方法仅清理当前登录用户的过期令牌,无法处理长期未登录用户的遗留令牌。

方法三:手动一次性清理

如果只是临时清理数据库中的过期令牌,可通过以下两种方式快速执行:

  1. 使用Artisan Tinker
php artisan tinker

在Tinker中执行:

Laravel\Sanctum\PersonalAccessToken::where('expires_at', '<=', now())->delete();
  1. 直接执行SQL语句
    根据数据库类型运行对应SQL,例如MySQL:
DELETE FROM personal_access_tokens WHERE expires_at <= NOW();

注意事项

  • 所有清理操作仅针对expires_at小于等于当前时间的令牌,不会影响有效令牌
  • 定时任务的执行频率可根据令牌有效期调整,比如30分钟有效期的令牌,每小时清理一次即可
  • 若涉及数据库事务,需确保清理操作不会干扰其他业务逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:52:38