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

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. 收尾配置与测试
  1. 如果你还没初始化Passport,先运行命令生成加密密钥和客户端:
php artisan passport:install
  1. 确保App\Providers\AuthServiceProvider中已经注册了Passport路由(默认已经包含,若没有则添加):
public function boot()
{
    $this->registerPolicies();

    Passport::routes();
}
  1. 测试:用Postman/curl请求/api/admin/login,传入username和passwd参数,拿到Bearer令牌后,请求需要auth:admin-api中间件的接口,就能验证自定义表的认证逻辑了。

如果你的表结构还有其他特殊情况(比如密码加密方式不同),可以在模型的getAuthPassword方法里做对应处理,或者在认证时手动校验密码。

内容的提问来源于stack exchange,提问作者Backi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:56:55