You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel登录表单日语IME半角输入密码乱码致登录失败求助

问题分析与解决方案

这个问题我之前也碰到过,本质是日语IME的半角输入模式下,输出的字符并不是标准的ASCII半角数字,而是JIS X 0201编码的特殊半角字符(也就是你看到的ヌフアウエ这类伪半角片假名/数字),它们的UTF-8编码和普通ASCII数字完全不同,所以Laravel做哈希验证时自然匹配不上。

必须进行编码转换处理,具体解决方案如下:

1. 在登录控制器中直接处理密码输入

修改你的LoginController的登录逻辑,在获取密码后先做编码转换:

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

public function authenticate(Request $request)
{
    // 把IME输入的特殊半角字符转成标准ASCII半角数字
    $processedPassword = mb_convert_kana($request->password, 'n', 'UTF-8');
    
    $credentials = [
        'email' => $request->email,
        'password' => $processedPassword,
    ];

    if (Auth::attempt($credentials, $request->filled('remember'))) {
        $request->session()->regenerate();
        return redirect()->intended(RouteServiceProvider::HOME);
    }

    return back()->withErrors([
        'email' => 'The provided credentials do not match our records.',
    ])->onlyInput('email');
}

这里mb_convert_kana'n'参数会自动把全角数字、英文字母转成半角,同时把IME生成的特殊伪半角字符转换为标准ASCII数字。

2. 用请求类统一处理(更优雅的方式)

如果你的项目使用了自定义请求类(比如LoginRequest),可以在请求的预处理阶段自动处理密码,这样所有登录请求都会自动完成转换:

// app/Http/Requests/Auth/LoginRequest.php
protected function prepareForValidation()
{
    // 把处理后的密码合并到请求数据中
    $this->merge([
        'password' => mb_convert_kana($this->password, 'n', 'UTF-8'),
    ]);
}

3. 额外注意事项

  • 确保你的Laravel项目编码是UTF-8,数据库表和字段的编码设置为utf8mb4,避免编码转换带来的额外问题。
  • 如果mb_convert_kana函数不可用,需要开启PHP的mbstring扩展(通常默认是开启的,若未开启,在php.ini里启用即可)。

这样处理后,不管用户用日语IME的半角模式还是英文键盘输入,密码都会被转换成标准的ASCII数字,登录验证就能正常通过了。

内容的提问来源于stack exchange,提问作者Aung Ko Ko

火山引擎 最新活动