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

如何在Backpack后台登录流程中校验users表的额外字段(如approval)

在Backpack后台登录流程中校验额外用户字段(不修改vendor目录)

要在Backpack后台登录时校验users表的额外字段(比如approval)且不修改vendor目录,你可以通过自定义登录控制器+覆盖路由的方式实现,具体步骤如下:

1. 创建自定义登录控制器

在app/Http/Controllers/Auth目录下新建LoginController.php(目录不存在就手动创建),继承Backpack的默认登录控制器,重写认证逻辑:

<?php

namespace App\Http\Controllers\Auth;

use Backpack\CRUD\app\Http\Controllers\Auth\LoginController as BackpackLoginController;
use Illuminate\Http\Request;

class LoginController extends BackpackLoginController
{
    // 方法一:先校验审核状态,再执行默认认证
    protected function authenticate(Request $request)
    {
        $this->validateLogin($request);

        // 根据登录账号查询用户
        $user = \App\Models\User::where($this->username(), $request->{$this->username()})->first();
        
        // 检查用户是否存在且未审核
        if ($user && !$user->approval) {
            return $this->sendFailedLoginResponse($request, '你的账号尚未通过审核,请联系管理员。');
        }

        // 调用父类的默认认证逻辑(校验账号密码)
        return parent::authenticate($request);
    }

    // ------------------------------
    // 方法二:直接把审核状态加入认证条件(更简洁,但错误提示是默认的)
    // protected function credentials(Request $request)
    // {
    //     // 合并默认认证条件 + 审核通过的条件
    //     return array_merge(parent::credentials($request), ['approval' => 1]);
    // }
}

两种方法可选:

  • 方法一能返回自定义的未审核提示,用户体验更好;
  • 方法二更简洁,但错误提示会用Laravel默认的「这些凭据与我们的记录不匹配」,适合不需要自定义提示的场景。

2. 覆盖Backpack的登录路由

在routes/backpack/custom.php文件中(没有就新建这个文件),添加路由覆盖默认的Backpack登录路由,指向你刚创建的自定义控制器:

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\LoginController;

// 覆盖Backpack默认的登录页面路由
Route::get('login', [LoginController::class, 'showLoginForm'])->name('backpack.auth.login');
// 覆盖Backpack默认的登录提交路由
Route::post('login', [LoginController::class, 'login'])->name('backpack.auth.login.post');

3. 自定义错误提示(可选)

如果用方法一,建议把错误提示放到语言文件里方便维护:
在resources/lang/zh-CN/auth.php(根据你的应用语言调整)中添加:

<?php

return [
    // ... 其他默认提示
    'not_approved' => '你的账号尚未通过审核,请联系管理员。',
];

然后修改控制器里的错误提示调用:

return $this->sendFailedLoginResponse($request, __('auth.not_approved'));

前置要求

确保你的users表已经添加了approval字段(推荐用tinyint类型,默认0代表未审核,1代表已审核),可以通过迁移文件创建:

Schema::table('users', function (Blueprint $table) {
    $table->tinyInteger('approval')->default(0)->comment('是否审核通过');
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:54:50