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

