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

Laravel开发:如何在数据填充时为用户生成Sanctum令牌?

Laravel开发:如何在数据填充时为用户生成Sanctum令牌?

最近在做一个仅面向已认证用户的Laravel REST API,用Laravel Sanctum实现身份验证。本地开发阶段,我会用数据填充功能给数据库批量创建测试用户,目前的填充代码是这样的:

User::factory()->count(2)->hasLocations(100)->create();

但每次填充完用户后,都得手动生成Sanctum令牌才能测试接口,实在有点繁琐。后来我摸索出两种简单的方法,能在数据填充时自动给用户生成令牌,分享给大家:

方法一:在User工厂中封装令牌生成逻辑

直接修改你的User模型工厂,在用户创建完成后自动生成令牌。这样每次通过工厂创建用户,都会附带生成对应的Sanctum令牌:

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    protected $model = User::class;

    public function definition()
    {
        return [
            'name' => $this->faker->name(),
            'email' => $this->faker->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => Hash::make('password'), // 统一设置测试密码,方便登录
            'remember_token' => Str::random(10),
        ];
    }

    // 添加这个方法,实现创建用户后生成令牌的逻辑
    public function withToken()
    {
        return $this->afterCreating(function (User $user) {
            // 生成自定义名称的令牌,这里命名为local-dev-token
            $token = $user->createToken('local-dev-token')->plainTextToken;
            
            // 把令牌打印到控制台,方便直接复制使用
            echo "用户 {$user->email} 的访问令牌:{$token}\n";
        });
    }
}

之后在Seeder里调用这个withToken方法就行:

User::factory()->count(2)->hasLocations(100)->withToken()->create();

运行填充命令后,控制台会直接输出每个用户的令牌,省去手动生成的步骤。

方法二:在Seeder中直接处理用户令牌

如果不想改动工厂文件,也可以在Seeder里遍历创建好的用户集合,逐个生成令牌:

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        // 创建用户并获取返回的用户集合
        $users = User::factory()->count(2)->hasLocations(100)->create();
        
        // 遍历每个用户,生成令牌并打印
        $users->each(function ($user) {
            $token = $user->createToken('local-dev-token')->plainTextToken;
            echo "用户 {$user->name}({$user->email})的访问令牌:{$token}\n";
        });
    }
}

两种方法都挺好用的,我个人更偏爱第一种,因为把令牌生成逻辑封装在工厂里,后续其他地方用工厂创建用户时也能复用。另外要注意,plainTextToken只会在创建时显示一次,之后就无法再获取了,所以一定要及时记录下来(打印到控制台或者写入日志都可以)。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:34:42