本文目录导读:

在 Laravel 中实现密码确认验证,主要有以下几种方式:
基本密码确认验证
表单验证规则
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'password' => 'required|min:8|confirmed',
// 'password_confirmation' => 'required|min:8' // 不需要手动添加,confirmed会自动验证
]);
在控制器中使用
public function store(Request $request)
{
$validated = $request->validate([
'password' => 'required|min:8|confirmed',
]);
// 创建用户等操作
}
自定义密码确认验证
使用 Rule 类
use Illuminate\Validation\Rule;
$validator = Validator::make($request->all(), [
'password' => [
'required',
'string',
'min:8',
'confirmed',
Rule::notIn(['password', '12345678']), // 禁止使用的密码
],
]);
自定义确认规则
$validator = Validator::make($request->all(), [
'password' => [
'required',
'min:8',
function ($attribute, $value, $fail) {
// 自定义验证逻辑
if (!preg_match('/[A-Z]/', $value)) {
$fail('密码必须包含大写字母');
}
if (!preg_match('/[0-9]/', $value)) {
$fail('密码必须包含数字');
}
},
'confirmed',
],
]);
使用 FormRequest 类(推荐)
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class RegisterRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users',
'password' => [
'required',
'string',
'min:8',
'confirmed',
'regex:/^(?=.*[A-Za-z])(?=.*\d)/', // 必须包含字母和数字
],
];
}
public function messages()
{
return [
'password.required' => '密码不能为空',
'password.min' => '密码至少8个字符',
'password.confirmed' => '两次输入的密码不一致',
'password.regex' => '密码必须包含字母和数字',
];
}
}
密码确认的完整示例
用户注册
public function register(RegisterRequest $request)
{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
return response()->json(['user' => $user], 201);
}
密码修改
public function updatePassword(Request $request)
{
$request->validate([
'current_password' => ['required', 'current_password'],
'new_password' => ['required', 'string', 'min:8', 'confirmed'],
]);
$user = $request->user();
$user->update([
'password' => Hash::make($request->new_password),
]);
return redirect()->back()->with('success', '密码修改成功');
}
自定义密码确认验证器
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class PasswordConfirmation implements Rule
{
protected $password;
protected $confirmation;
public function __construct($password = null)
{
$this->password = $password;
}
public function passes($attribute, $value)
{
$this->confirmation = $value;
return $this->password === $value;
}
public function message()
{
return '两次输入的密码不一致';
}
}
// 使用方法
$rules = [
'password' => ['required', new PasswordConfirmation($request->password_confirmation)],
];
前端配合示例
<!-- 注册表单 -->
<form method="POST" action="{{ route('register') }}">
@csrf
<div>
<label for="password">密码</label>
<input type="password"
name="password"
id="password"
value="{{ old('password') }}"
class="form-control @error('password') is-invalid @enderror">
@error('password')
<span class="invalid-feedback">{{ $message }}</span>
@enderror
</div>
<div>
<label for="password_confirmation">确认密码</label>
<input type="password"
name="password_confirmation"
id="password_confirmation"
class="form-control @error('password') is-invalid @enderror">
</div>
</form>
高级密码规则(安全性)
$rules = [
'password' => [
'required',
'string',
'min:8', // 最小长度
'max:255', // 最大长度
'confirmed', // 确认密码
'unique:users', // 不能与旧密码相同(需要自定义验证)
'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])/', // 包含大小写字母、数字、特殊字符
'not_regex:/\s/', // 不能包含空格
],
'password_confirmation' => 'required|same:password',
];
数据库直接验证(不推荐)
// 使用 DB facade
use Illuminate\Support\Facades\DB;
$user = DB::table('users')
->where('email', $request->email)
->first();
if (Hash::check($request->password, $user->password)) {
// 密码正确
}
注意事项
- 字段命名:默认要求密码字段名为
password,确认字段名为password_confirmation - 自动验证:
confirmed规则会自动检查password_confirmation字段 - 错误消息:可以通过
messages()方法自定义错误消息 - 安全性:密码存储必须使用
Hash::make()加密 - 实时验证:可以配合前端 JavaScript 实现实时验证
选择哪种方式取决于你的需求,推荐使用 FormRequest 方式,因为它更结构化且易于维护。