Laravel自定义认证:基于注册编号而非邮箱字段实现用户认证
嘿,作为Laravel新手想自定义认证字段太正常啦,我来一步步带你搞定用注册编号登录的需求:
1. 自定义LoginController的认证字段
Laravel默认用email做认证标识,咱们只需要在app/Http/Controllers/Auth/LoginController.php里添加一个username()方法,返回你的注册编号字段名就行(假设你的字段叫registration_number):
/** * 获取用于用户认证的字段名 * * @return string */ public function username() { return 'registration_number'; }
这个方法会告诉Laravel:别用email啦,用我指定的这个字段来匹配用户。
2. 更新登录请求的验证规则
默认的LoginController会用email的验证规则(比如邮箱格式校验),咱们得把这个规则改成适配注册编号的。直接在LoginController里重写validateLogin()方法:
use Illuminate\Http\Request; /** * 验证登录请求的合法性 * * @param \Illuminate\Http\Request $request * @return void */ protected function validateLogin(Request $request) { $request->validate([ $this->username() => 'required|string', 'password' => 'required|string', ]); }
这样就去掉了不必要的邮箱格式校验,只保证注册编号和密码是必填的字符串就行。
3. 修改登录视图的表单
接下来要把登录页面里的email输入框换成注册编号的,找到resources/views/auth/login.blade.php,把原来的email相关代码替换成下面的内容:
<div class="form-group row"> <label for="registration_number" class="col-md-4 col-form-label text-md-right">{{ __('Registration Number') }}</label> <div class="col-md-6"> <input id="registration_number" type="text" class="form-control @error('registration_number') is-invalid @enderror" name="registration_number" value="{{ old('registration_number') }}" required autocomplete="registration_number" autofocus> @error('registration_number') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div>
别忘把标签文字和输入框的name、id都改成和注册编号字段一致的哦,不然请求没法正确传递字段值。
4. 确保用户表有注册编号字段
最后,你的users数据表必须有registration_number这个字段,而且建议设置成唯一的(避免重复注册)。如果还没加这个字段,先生成迁移文件:
php artisan make:migration add_registration_number_to_users_table
打开生成的迁移文件,修改up()和down()方法:
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up() { Schema::table('users', function (Blueprint $table) { $table->string('registration_number')->unique(); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('registration_number'); }); } };
然后运行迁移:
php artisan migrate
小提示
如果你的注册流程也需要用户填写注册编号,记得同步修改RegisterController的验证规则和注册视图,确保注册时能把这个字段正确保存到用户表里哦~
这样操作完,用户就能用注册编号+密码完成登录啦!
内容的提问来源于stack exchange,提问作者Chukwuebuka

