开启 token 哈希后,laravel 的 `validate` 方法无法直接校验原始凭据,因为数据库存储的是哈希值。正确的做法是在调用 `validate` 之前,先使用 `hash::check()` 对输入的密码进行比对,或者在自定义验证规则中处理哈希逻辑。对于 api 场景,通常建议在中间件或 service 层完成身份验证,而不是依赖表单验证。

如何手动校验密码字段?
在控制器中,你可以先获取输入数据,然后使用 `Illuminate\Support\Facades\Hash` 门面来检查密码是否匹配。如果匹配,再执行后续的业务逻辑;如果不匹配,抛出异常或返回错误响应。

use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
public function authenticate(Request $request)
{
$credentials = $request->only('email', 'password');
// 假设我们有一个根据邮箱查找用户的方法
$user = User::where('email', $credentials['email'])->first();
if (!$user || !Hash::check($credentials['password'], $user->password)) {
return response()->json(['message' => 'Invalid credentials'], 401);
}
// 生成 Token
$token = $user->createToken('api-token')->plainTextToken;
return response()->json(['token' => $token]);
}
上述代码展示了标准的认证流程:首先通过邮箱定位用户,然后使用 Hash::check() 验证明文密码与数据库中哈希值的匹配度。只有当两者一致时,才允许生成新的访问令牌。这种方法避免了将未经验证的凭据传递给任何可能泄露哈希值的组件。
如何在自定义验证规则中使用哈希校验?
如果你希望将哈希校验集成到 Laravel 的验证管道中,可以创建一个自定义的验证规则类。这样可以在 validate 调用期间自动执行检查,保持控制器逻辑的整洁。

namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
class ValidPassword implements Rule
{
public function __construct(public string $email)
{
//
}
public function passes($attribute, $value)
{
$user = User::where('email', $this->email)->first();
if (!$user) {
return false;
}
return Hash::check($value, $user->password);
}
public function message()
{
return 'The :attribute is incorrect.';
}
}
// 在控制器中使用
$request->validate([
'email' => 'required|email',
'password' => ['required', new ValidPassword($request->input('email'))],
]);
这个自定义规则类实现了 Rule 接口,其 passes 方法负责执行实际的哈希比对。在控制器中,我们将该规则实例作为数组元素传入 validate 方法。这种方式使得验证逻辑可复用,并且符合 Laravel 的设计模式。注意,由于需要查询数据库,这种规则可能会比简单的字符串比较稍慢,但在安全性上更有保障。
Token 哈希配置对现有登录逻辑的影响是什么?
当你在 config/hashing.php 中将驱动切换为 bcrypt 或 argon2id 时,所有新创建的密码都会被重新哈希。对于已存在的用户,Laravel 的 Hash::check() 能够自动识别旧格式(如 MD5)并尝试兼容,但最佳实践是强制用户在下次登录时重置密码,以确保所有数据都迁移到最新的哈希算法下。此外,API 令牌(Sanctum 或 Passport)本身不直接受密码哈希影响,但生成令牌的认证步骤必须依赖上述的密码校验逻辑。











