laravel 5,更新用户密码

Posted

技术标签:

【中文标题】laravel 5,更新用户密码【英文标题】:laravel 5,update User password 【发布时间】:2015-08-22 21:44:39 【问题描述】:

我正在使用 laravel 5 开发一个应用程序,允许每个用户更新他的个人资料。 为了更新密码,用户需要先输入他的旧密码,如果旧密码匹配,那么他新输入的密码将被散列并存储在数据库中。 如何使用 laravel 表单请求验证来验证这一点?

【问题讨论】:

可能是这个问题的副本。参考这个链接***.com/questions/28399899/… 我问过,如何在更新场景中验证用户密码,使用 laravel 表单请求验证,而不是在控制器操作中手动进行。 【参考方案1】:

我创建了一个自定义验证器并将其添加到 AppServiceProvider 中,如下所示:

<?php

namespace App\Providers;

use Validator;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Hash ;
class AppServiceProvider extends ServiceProvider

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    
        Validator::extend('password_hash_check', function($attribute, $value, $parameters, $validator) 
            return Hash::check($value , $parameters[0]) ;
        );
    

然后我在我的表单请求验证器中使用它,如下所示:

<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class UpdateUserProfileRequest extends Request

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    
        $hashed_password = $this->user()->password ;
        return [
            'oldPassword'=> "password_hash_check:$hashed_password|string|min:6",
            'newPassword' => 'required_with:oldPassword|confirmed|min:6',
        ];
    

【讨论】:

oldPassword 规则不应该包含 $hashed_pa​​ssword 的正确连接吗?像这样:“password_hash_check:'.$hashed_pa​​ssword.'|string|min:6”【参考方案2】:

当您要检查由

生成的哈希值时
Hash::make()

你需要使用

Hash::check('unhashed', $hashed)

每次运行Hash::make('string') 时,都会生成一个不同的哈希值,并且不会与前一个哈希值匹配。例如:

// Generate a hash
$password = Hash::make('password');

// $password == $2y$08$T9r9qUxrr6ejs9Ne.nLzMet8l0A8BM5QvLjhaaJasgsbMBdX4JjRu

// Generate a new hash
$new_password = Hash::make('password');

// $new_password ==  $2y$08$3KBlYKIMpIvk.TWwim9oPuwGA.Pzv1iF7BsDyYkz7kQlhkA/ueULe

// Compare hashes the WRONG way
$password === $new_password; // false

// Compare hash the RIGHT way
Hash::check('password', $password); // true
Hash::check('password', $new_password); // true 

所以使用 Hash 类的 Hash::make() 方法。

【讨论】:

谢谢。但我需要通过 laravel 表单请求进行验证,而不是手动进行。【参考方案3】:

我不确定,但我认为在 Laravel 中没有本地方法可以做到这一点。如果是这样,您可以实现自定义“哈希”验证器:

class CustomValidator extends \Illuminate\Validation\Validator 

    public function validateHash($attribute, $value, $parameters)
    
        $expected = $parameters[0];

        return Hash::check($value, $expected);
    

在提供者中注册:

class AppServiceProvider extends ServiceProvider 

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    
        require_once __DIR__ . '/../Http/helpers.php';

        Validator::resolver(function($translator, $data, $rules, $messages)
        
            return new CustomValidator($translator, $data, $rules, $messages);
        );
    

    // ...

并在表单请求中使用它:

class MyFormRequest extends FormRequest 

    public function rules()
    
        $password = Auth::user()->password;

        return [
            'old_password' => "required|hash:" . $password
        ]
    

    // ...


文档链接: http://laravel.com/docs/5.0/validation#custom-validation-rules

【讨论】:

以上是关于laravel 5,更新用户密码的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 从带有哈希的表单更新用户密码

Laravel 更新密码通过验证但不更新记录

用户在Laravel中更新密码后自动退出。我怎么防止这个?

Laravel 5.2 更改用户密码功能

Laravel 5 - 手动登录没有密码的用户

更改密码用户 laravel 5.3