Laravel中如何为非默认User模型的自定义模型创建auth令牌
Laravel Sanctum 非User模型令牌实现方案
Laravel Sanctum原生支持多模型令牌发放与校验,不需要修改框架核心代码,按以下步骤配置即可:
- 第一步:给目标模型引入能力Trait
所有需要发放令牌的模型,必须先继承Illuminate\Foundation\Auth\User认证基类,再引入Laravel\Sanctum\HasApiTokensTrait,示例:<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Laravel\Sanctum\HasApiTokens; class Customer extends Authenticatable { use HasApiTokens; // 模型其余原有逻辑 } - 第二步:新增认证守卫与用户提供者配置
打开config/auth.php配置文件,在对应节点新增自定义模型的guard和provider,不要覆盖原有默认配置,避免影响原有User模型的认证逻辑:'guards' => [ // 保留原有web、api等默认守卫 'customer' => [ 'driver' => 'sanctum', 'provider' => 'customers', ], ], 'providers' => [ // 保留原有users等默认提供者 'customers' => [ 'driver' => 'eloquent', 'model' => App\Models\Customer::class, ], ], - 第三步:令牌发放逻辑
令牌创建逻辑和默认User模型完全一致,直接调用模型实例的createToken方法即可:// 以Customer登录逻辑为例 $customer = Customer::where('mobile', $request->mobile)->first(); if (!Hash::check($request->password, $customer->password)) { return response()->json(['message' => '认证失败'], 401); } // 生成明文令牌,直接返回给前端存储即可 $token = $customer->createToken('customer-access')->plainTextToken; return response()->json(['token' => $token]); - 第四步:路由令牌校验
受保护路由使用auth:sanctum中间件时,把上一步自定义的守卫名作为参数传入,即可自动对应到目标模型做令牌校验:// routes/api.php Route::group(['middleware' => 'auth:sanctum:customer'], function () { Route::get('/customer/info', function () { // 获取当前认证的Customer模型实例 return auth('customer')->user(); }); });
注意事项:
- 多模型同时使用Sanctum时不需要修改
personal_access_tokens表结构,Sanctum会自动通过表内的tokenable_type字段区分令牌归属模型,不同模型的令牌逻辑完全隔离互不影响- 不要直接修改Sanctum包内的源码或者默认配置项,所有自定义逻辑通过新增guard的方式实现即可,后续升级框架版本不会出现兼容问题
- 如果需要修改令牌默认过期时间、能力范围等规则,非User模型的配置方式和User模型完全一致,直接在
createToken方法传参或者在AuthServiceProvider里配置即可
内容的提问来源于stack exchange,提问作者digdigdoot
相关产品推荐
相关产品推荐

