如何让用户在 Laravel 7.x 中更改自己的密码?

Posted

技术标签:

【中文标题】如何让用户在 Laravel 7.x 中更改自己的密码?【英文标题】:How to let users change their own passwords in Laravel 7.x? 【发布时间】:2020-08-15 06:19:35 【问题描述】:

有numerousposts关于如何允许用户更改密码,但其中许多是针对旧版本的 Laravel。 2020年Laravel v7.x的正确做法是什么?

【问题讨论】:

我刚刚创建了 laravel 用户更改密码。更新密码的最干净的方法。看看这个gist.github.com/Aslam97/4c320dac0c50f3bbfd64164ad8fdd61a 【参考方案1】:

首先,让我们为用户创建一个表单。

关于此表格的几点说明:

我使表单尽可能简单以使其可读 - CSRF 令牌由 Form::open 自动创建

您应该使用“密码”作为密码管理员应该自动填充的字段名称。一些答案建议使用“密码”作为新密码字段名称,这会造成非常糟糕的用户体验

Form::open(array('url' => '/account/change-password'))
<input type="hidden" name="_token" value=" csrf_token() ">

<div class="form-group">

    <div class="row">
        <div class="col">
            <label for="password" class="control-label">Current Password</label>
        </div>
        <div class="col">
            Form::password('password', array('id' => 'password', 'class' => 'form-control', 'placeholder' => 'Password'))
        </div>
    </div>
</div>

<div class="form-group">
    <div class="row">
        <div class="col">
            <label for="new-password" class="control-label">New Password</label>
        </div>
        <div class="col">
            Form::password('new-password', array('id' => 'new-password', 'class' => 'form-control', 'placeholder' => 'New Password'))
        </div>
    </div>
</div>

<div class="form-group">
    <div class="row">
        <div class="col">
            <label for="new-password-confirmation" class="control-label">Re-enter
                Password</label>
        </div>
        <div class="col">
            Form::password('new-password-confirmation', array('id' => 'new-password-confirmation', 'class' => 'form-control', 'placeholder' => 'Confirm Password'))
        </div>
    </div>
</div>

<div class="form-group">
    <button type="submit" class="btn btn-danger">Change Password</button>
</div>
Form::close()

现在在您要处理请求的控制器中,让我们更改密码。

关于此的几点说明:

我们确认密码不是通用密码 - 此处使用的列表并非详尽无遗(全部小写),我建议您使用等于或大于您的最小长度的 the common passwords 更新它 说到最小长度,8 个字符应该是你在这个时代的起点 最后,不要验证密码确认的长度 - 它只会给你两个错误(因为它已经完成了) 最后,这不会审核密码更改。使用 Laravel Auditing 之类的东西,甚至只是发送电子邮件。

Account.php

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

 /**
 * Change users password
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\RedirectResponse
 */
public function changePassword(Request $request)

    if(Auth::Check())
    
        $requestData = $request->All();
        $validator = $this->validatePasswords($requestData);
        if($validator->fails())
        
            return back()->withErrors($validator->getMessageBag());
        
        else
        
            $currentPassword = Auth::User()->password;
            if(Hash::check($requestData['password'], $currentPassword))
            
                $userId = Auth::User()->id;
                $user = User::find($userId);
                $user->password = Hash::make($requestData['new-password']);;
                $user->save();
                return back()->with('message', 'Your password has been updated successfully.');
            
            else
            
                return back()->withErrors(['Sorry, your current password was not recognised. Please try again.']);
            
        
    
    else
    
        // Auth check failed - redirect to domain root
        return redirect()->to('/');
    


/**
 * Validate password entry
 *
 * @param array $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
public function validatePasswords(array $data)

    $messages = [
        'password.required' => 'Please enter your current password',
        'new-password.required' => 'Please enter a new password',
        'new-password-confirmation.not_in' => 'Sorry, common passwords are not allowed. Please try a different new password.'
    ];

    $validator = Validator::make($data, [
        'password' => 'required',
        'new-password' => ['required', 'same:new-password', 'min:8', Rule::notIn($this->bannedPasswords())],
        'new-password-confirmation' => 'required|same:new-password',
    ], $messages);

    return $validator;


/**
 * Get an array of all common passwords which we don't allow
 *
 * @return array
 */
public function bannedPasswords()
    return [
        'password', '12345678', '123456789', 'baseball', 'football', 'jennifer', 'iloveyou', '11111111', '222222222', '33333333', 'qwerty123'
    ];

【讨论】:

您好只是想问一下这个问题,我不断收到“此路由不支持 POST 方法”。 我也尝试了所有其他路由,但它不起作用(我是 laravel 的新手) laravel.com/docs/8.x/validation#rule-confirmed 用于密码确认使用专用规则。

以上是关于如何让用户在 Laravel 7.x 中更改自己的密码?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 laravel 版本从 8.x 降级到 7.x?

如何在 Laravel 中更改用户表?

Laravel 5 - 从他的所有设备中注销用户

如何使用 Laravel 制作自定义主题以及在哪里存储主题数据?

如何更改 laravel 中的用户模型以使用其他表进行身份验证而不是用户?

如何在 Laravel 中使用多个数据库并随用户更改数据库连接? [复制]