如何移除Laravel Sanctum生成令牌中携带的数据库ID
Laravel Sanctum 令牌前缀问题解答
你提到的使用Sanctum生成的令牌格式98|b45h97e17VVpugjO71wwURoicIqDQP2ejTkCWwoD中,|分隔符前的数字就是令牌对应数据库记录的主键ID,相关问题解答如下:
一、默认携带数据库ID前缀的原因
- 查询性能优化:校验令牌时可以直接通过前缀的ID定位到
personal_access_tokens表中的对应记录,无需全表扫描匹配,大幅提升大流量场景下的身份校验效率。 - 哈希存储安全适配:Sanctum在数据库中存储的是令牌明文的SHA-256哈希值,无法逆推出原始令牌。如果没有ID前缀,校验时需要遍历全表所有令牌哈希逐一比对,性能开销极高,ID前缀可以直接定位到唯一记录,仅需一次哈希比对即可完成校验。
- 生态兼容性:该前缀格式是Laravel生态通用的令牌标准,Breeze、Jetstream等官方身份验证脚手架均默认适配该格式,降低组件适配成本。
二、移除数据库ID前缀的操作方法
注意:移除ID前缀会牺牲令牌校验性能,仅在业务确有需求时操作
- 首先执行命令发布Sanctum的配置文件:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" - 打开项目中生成的
config/sanctum.php配置文件,找到prefix_token_ids配置项,将其值修改为false:
return [ // 其他配置项省略 'prefix_token_ids' => false, ];
- 配置修改完成后,后续新生成的令牌就不会携带ID前缀,仅保留纯随机字符串格式。
提示:修改配置前已经生成的带前缀令牌仍然可以正常校验使用,如果需要全量替换为无前缀格式,需要作废所有旧令牌,引导用户重新登录获取新令牌。
内容的提问来源于stack exchange,提问作者Biswajit Biswas
相关产品推荐
相关产品推荐

