Laravel 9 + Jetstream/Inertia/Fortify用户名登录如何区分大小写?
实现Laravel Jetstream/Fortify用户名登录区分大小写的解决方案
核心问题原因
当前用户名登录不区分大小写,本质是MySQL默认字符排序规则(如utf8mb4_general_ci、utf8mb4_unicode_ci)对大小写不敏感,Laravel默认的where查询会遵循这一规则。要实现区分大小写,需从数据库字段配置和认证查询逻辑两方面调整。
解决步骤
1. 配置用户名字段的区分大小写排序规则
如果用户表尚未创建,在迁移文件中为username字段指定区分大小写的排序规则:
Schema::create('users', function (Blueprint $table) { // 其他字段配置... $table->string('username')->unique()->collate('utf8mb4_bin'); });
若表已存在,通过SQL命令修改字段排序规则:
ALTER TABLE users MODIFY COLUMN username VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin UNIQUE;
2. 修改Fortify认证查询逻辑
在app/Providers/JetstreamServiceProvider.php的Fortify::authenticateUsing闭包中,针对用户名使用二进制精确匹配(区分大小写),邮箱保持原有不区分大小写的逻辑:
Fortify::authenticateUsing(function (Request $request) { $user = User::where('email', $request->username) // 用BINARY强制用户名区分大小写匹配 ->orWhereRaw('BINARY username = ?', [$request->username]) ->first(); if ($user && Hash::check($request->password, $user->password)) { return $user; } });
3. 可选:注册/更新时的用户名唯一性校验
为避免用户创建大小写重复的用户名(如Admin和admin),在注册验证规则中添加区分大小写的唯一性校验:
// 可在Fortify注册规则或User模型验证逻辑中添加 'username' => [ 'required', 'string', 'max:255', Rule::unique('users')->where(function ($query) use ($request) { return $query->whereRaw('BINARY username = ?', [$request->username]); }), ],
内容的提问来源于stack exchange,提问作者Bytech
相关产品推荐
相关产品推荐

