PHP项目Laravel密码确认验证规则

wen PHP项目 2

本文目录导读:

PHP项目Laravel密码确认验证规则

  1. 基本密码确认验证
  2. 自定义密码确认验证
  3. 使用 FormRequest 类(推荐)
  4. 密码确认的完整示例
  5. 自定义密码确认验证器
  6. 前端配合示例
  7. 高级密码规则(安全性)
  8. 数据库直接验证(不推荐)
  9. 注意事项

在 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)) {
    // 密码正确
}

注意事项

  1. 字段命名:默认要求密码字段名为 password,确认字段名为 password_confirmation
  2. 自动验证confirmed 规则会自动检查 password_confirmation 字段
  3. 错误消息:可以通过 messages() 方法自定义错误消息
  4. 安全性:密码存储必须使用 Hash::make() 加密
  5. 实时验证:可以配合前端 JavaScript 实现实时验证

选择哪种方式取决于你的需求,推荐使用 FormRequest 方式,因为它更结构化且易于维护。

抱歉,评论功能暂时关闭!