Laravel 5密码重置不起作用

Posted

技术标签:

【中文标题】Laravel 5密码重置不起作用【英文标题】:Laravel 5 password reset not working 【发布时间】:2015-07-01 06:38:19 【问题描述】:

我正在开发 laravel 5 电子商务门户网站。

当用户使用现成的脚本更新密码时,我遇到了问题。

问题是我可以毫无问题地将链接完美地发送给客户,客户也可以更改他的密码。但是当注销并重新登录时,我收到Invalid credentials的错误。

在我的 routes.php 中,我有这个:

Route::controllers([
    'auth' => 'Auth\AuthController',
    'password' => 'Auth\PasswordController',
]);

这是登录页面:

<form class="form-horizontal" role="form" method="POST" action=" url('/login') ">
    <input type="hidden" name="_token" value=" csrf_token() ">

    <div class="form-group">
        <label class="col-md-4 control-label">E-Mail Address</label>
        <div class="col-md-6">
            <input type="email" class="form-control" name="email" value=" old('email') ">
        </div>
    </div>

    <div class="form-group">
        <label class="col-md-4 control-label">Password</label>
        <div class="col-md-6">
            <input type="password" class="form-control" name="password">
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-4"></div>
        <div class="col-md-4">
            <a href="url('/password/email')">Forgot Password</a>
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-6 col-md-offset-4">
            <button type="submit" class="btn btn-primary btn-block">Login</button>
        </div>
    </div>
</form>

重置密码后退出后无法再次登录。

编辑 1

在登录表单页面点击登录按钮时,会调用postLogin方法。这是代码

public function postLogin( Request $request ) 
    $this->validate( $request, [
        'email'     => ['required', 'exists:users,email,role,customer'],
        'password'  => 'required'
    ]);

    $credentials = $request->only('email', 'password');

    if ( \Auth::attempt($credentials) ) 
        \Session::flash('logged_in', 'You have successfully logged in.');
        return redirect('/');
    

    return redirect('/login')->withInput($request->all())->withErrors(['email' => 'Invalid Email Address Or Password']);

编辑 2

我只是意识到登录没有检查哈希,因此在更新密码并重新登录后执行dd(\Hash::check($request-&gt;password, $user-&gt;password)) 时返回false。这可能是什么问题?

我哪里做错了?请指导我。

提前致谢。

P.S.:我只使用默认值来更新密码,其余的,我已经制作了控制器和模型,它们都可以正常工作,没有任何问题。

【问题讨论】:

【参考方案1】:

如果更改后新密码不起作用,则更改密码时出现问题。

最有可能怀疑是加密。您可能没有使用 Hash::make($password) 并将其保存为纯文本格式。

您可以使用函数 Hash::check($password, $hash); 仔细检查哈希是否正确保存到数据库中;

登录时可以查看密码为

public function postLogin( Request $request ) 
    $user=User::where('email', $request->email);
    Log::debug("Testing $request->password $user->password ". Hash::check($request->password, $user->password));

如果 Hash::check 为 false,则保存新密码时出现问题。 $user->password 必须是散列形式。

【讨论】:

在哪里以及如何检查? 使用 Eloquent User::find($id) 从 DB 中获取用户对象并从那里获取密码哈希 $user->password 你能帮我写代码吗,我对此有点困惑。 这里是日志详细信息:[2015-04-23 14:15:17] local.DEBUG: Testing qazxswedc $2y$10$TPo3aLnlHkQQ.5Ql1ZUCb.6.EZgP9os6iDIrlfgqB/l5TlnYIPq3e 密码是散列而不是明文。 Hash::check() 值不可见,但它应该为真或假。如果旧密码和新密码的 Hash::check() 为假,那么密码周围可能会有一些额外的空格等。您需要玩,直到您了解哪个密码被散列并查看如何确保密码正确将被散列并保存到数据库:【参考方案2】:

我也偶然发现了这个并找到了答案here,只是添加这个以供将来参考..

原因是当你在 User 模型上添加 setPasswordAttribute 方法时,当使用 Laravel 的内置密码重置功能时,密码会被哈希两次。正如 Laracast 页面所解释的,它所需要的只是检查一个已经散列的密码,例如:

// Add Hash facade
use Illuminate\Support\Facades\Hash;

class User extends Authenticatable


    // ...

    /**
     * Automatically hash password
     * 
     * @param String $value The password, maybe hashed already
     * 
     * @return string|null
     */
    public function setPasswordAttribute($value)
    
        if ($value) 
            $this->attributes['password'] = Hash::needsRehash($value) ? Hash::make($value) : $value;
        
    

【讨论】:

以上是关于Laravel 5密码重置不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB 密码重置不起作用

Magento密码重置不起作用

PHP - 密码重置表单不起作用

从发送的电子邮件网络核心身份调用重置密码时不起作用

Azure AD B2C 自助服务密码重置链接不起作用 [关闭]

jQuery Parsley/Laravel - 密码验证不起作用