如何使用 Laravel 5.8 将散列密码存储到数据库中

Posted

技术标签:

【中文标题】如何使用 Laravel 5.8 将散列密码存储到数据库中【英文标题】:How to store Hashed Password to the Database using Laravel 5.8 【发布时间】:2021-01-14 07:00:29 【问题描述】:

我需要将密码作为散列存储到数据库中,我能够拥有密码,但是当我提交表单时,密码存储为未散列,

这是我的控制器存储功能

 public function store(Request $request)


    $hash = ['password' => Hash::make($request)];

    //dd($hash);
    // HASHED PASSWORD WAS DISPLAYED HERE 


    $user = User::create($this->validateRequest());

    dd('User Created');

这是我的验证函数

private function validateRequest()


    return request()->validate([
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
        'phone' => 'required',
    ]);

我尝试在我的 Store Function 中执行此操作(但没有成功!!)

public function store(Request $request)
    

        $hash = ['password' => Hash::make($request)];

        $user = User::create($this->validateRequest($hash));
        dd('User Created');
   

有没有办法通过这种方式将哈希密码存储到数据库中?

否则我需要坚持这种方式;(?

$user = User::create([
            'name' => $request['name'],
            'phone' => $request['phone'],
            'email' => $request['email'],
            'password' => Hash::make($request['password']),
        ]);

我只是希望我的控制器用几行代码变得干净。

谁能帮帮我。

谢谢

【问题讨论】:

您必须修改从validateRequest 获得的数组以添加散列密码 @lagbox 我该如何修改它。请给我一个例子。 【参考方案1】:

在您的 User 模型中使用一个修改器,这样每次您设置密码时,它都会被散列。

public function setPasswordAttribute($password)

    $this->attributes['password'] = Hash::make($password);

这样,您的store 方法将如下所示:

public function store(Request $request)

    $user = User::create($this->validateRequest());
    dd('User Created');


这超出了本问题的范围,但只是另外一个建议:您应该使用表单请求类 (https://laravel.com/docs/8.x/validation#creating-form-requests) 以减少控制器中的代码量(以及其他优势)。

【讨论】:

【参考方案2】:

您在更改password 的值后验证request,因此无法验证密码确认并返回验证错误。

首先验证request,然后将password 值替换为散列值。

public function store(Request $request)

    $request->validate([
      'name' => ['required', 'string', 'max:255'],
      'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
      'password' => ['required', 'string', 'min:8', 'confirmed'],
      'phone' => 'required',
    ]);
    
    $request->merge(['password' => Hash::make($request->input('password'))]);

    $user = User::create($request->all());
    dd($user);

【讨论】:

我不希望验证在我的函数中,有没有办法可以使用我已经创建的验证函数?

以上是关于如何使用 Laravel 5.8 将散列密码存储到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 如何将散列密码插入表?

如何使 Vue.js 将散列密码发布到 Django REST API AbstractBaseUser 自定义模型?

使用 bcryptjs 将散列密码保存到数据库时出错

shiro学习三

PHP 去散列密码

如何将散列数组添加到 csv 文件中?