如何使用 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 将散列密码存储到数据库中的主要内容,如果未能解决你的问题,请参考以下文章