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
相关产品推荐
相关产品推荐

