Laravel 5.3基于Laravel-Passport的OAuth认证:自定义表替代Users表
刚好之前折腾过Laravel Passport自定义表认证的需求,给你一步步拆解怎么实现,你可以根据自己的表名和字段调整:
1. 配置自定义用户模型
假设你的自定义表叫admins,登录字段是username,密码字段是passwd(替换默认的email和password),先创建/调整你的模型:
// app/Models/Admin.php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Laravel\Passport\HasApiTokens; class Admin extends Authenticatable { use HasApiTokens; // 指定自定义表名 protected $table = 'admins'; // 允许批量赋值的字段,按需调整 protected $fillable = ['username', 'passwd', 'name']; // 重写密码字段获取逻辑,告诉框架用passwd字段做密码校验 public function getAuthPassword() { return $this->passwd; } // 重写登录标识字段,指定用username代替默认的email public function getAuthIdentifierName() { return 'username'; } // 如果你的表没有remember_token字段,加上这行避免报错 protected $rememberTokenName = null; }
2. 修改认证配置文件
打开config/auth.php,添加自定义的守卫(guard)和用户提供者(provider),让Passport知道要使用你的自定义表:
// config/auth.php 'guards' => [ // 保留原有web、api配置,新增自定义守卫 'admin-api' => [ 'driver' => 'passport', 'provider' => 'admins', ], ], 'providers' => [ // 保留原有users配置,新增自定义用户提供者 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], ],
3. 自定义登录令牌接口
默认Passport的密码模式会硬校验email和password字段,所以我们自己写一个登录接口,用自定义字段完成认证并生成令牌:
首先创建控制器:
// app/Http/Controllers/AdminAuthController.php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class AdminAuthController extends Controller { public function login(Request $request) { // 验证请求参数,替换成你的字段 $request->validate([ 'username' => 'required|string', 'passwd' => 'required|string', ]); // 使用自定义守卫进行身份校验 if (Auth::guard('admin-api')->attempt([ 'username' => $request->username, 'passwd' => $request->passwd ])) { $user = Auth::guard('admin-api')->user(); // 生成Passport访问令牌,可自定义令牌名称 $token = $user->createToken('AdminAccess')->accessToken; return response()->json([ 'access_token' => $token, 'token_type' => 'Bearer', ], 200); } return response()->json(['message' => '用户名或密码错误'], 401); } // 可选:注销令牌接口 public function logout(Request $request) { $request->user()->token()->revoke(); return response()->json(['message' => '已成功退出登录']); } }
然后在routes/api.php中注册路由:
use App\Http\Controllers\AdminAuthController; // 自定义登录路由 Route::post('/admin/login', [AdminAuthController::class, 'login']); // 注销路由需要自定义守卫的认证中间件 Route::post('/admin/logout', [AdminAuthController::class, 'logout'])->middleware('auth:admin-api');
4. 收尾配置与测试
- 如果你还没初始化Passport,先运行命令生成加密密钥和客户端:
php artisan passport:install
- 确保
App\Providers\AuthServiceProvider中已经注册了Passport路由(默认已经包含,若没有则添加):
public function boot() { $this->registerPolicies(); Passport::routes(); }
- 测试:用Postman/curl请求
/api/admin/login,传入username和passwd参数,拿到Bearer令牌后,请求需要auth:admin-api中间件的接口,就能验证自定义表的认证逻辑了。
如果你的表结构还有其他特殊情况(比如密码加密方式不同),可以在模型的getAuthPassword方法里做对应处理,或者在认证时手动校验密码。
内容的提问来源于stack exchange,提问作者Backi
相关产品推荐
相关产品推荐

