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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:05:20