php - Laravel 5.2 - Authenticated User to Change Password - 更新后密码匹配问题

标签 php forms laravel authentication passwords

所以我遇到了一个相当奇怪的问题。我创建了一个允许用户更改密码的表单。

它确实改变了他们的密码。但是它将他们的密码更改为 Laravel 显然无法识别的密码。

因此,如果我要使用“tinker”手动将密码更新为“testing”之类的密码;我将能够成功更改我的密码。但是,一旦我将密码更改为某些内容(例如 123456),表单将不会接受该密码。

当我注销用户并尝试使用新密码登录时;它不会让我登录。

很明显,Laravel 无法识别新密码。

代码在这里:

查看:

<div class="panel panel-default">
        <div class="panel-heading">Change Your Password</div>
            {{ Form::open(array('url' => 'security/change_password')) }}
                <div class="form-group">
                    {!! Form::label('current_password', 'Enter Current Password:') !!}
                    {!! Form::text('current_password', null, ['class'=>'form-control']) !!}
                </div>

                <div class="form-group">
                    {!! Form::label('password', 'Enter New Password:') !!}
                    {!! Form::text('password', null, ['class'=>'form-control']) !!}
                </div>

                <div class="form-group">
                    {!! Form::label('password_confirmation', 'Confirm New Password:') !!}
                    {!! Form::text('password_confirmation', null, ['class'=>'form-control']) !!}
                </div>

                <div class="form-group">
                    {!! Form::submit('Change Password', ['class' => 'btn btn-primary form-control']) !!}
                </div>                  
            {!! Form::close() !!}

    </div>

Controller :

public function updatePassword(UserSecurityFormRequest $request)
{

    $user = Auth::user();
    $current_password = $request->input('current_password');
    $new_password = $request->input('password');
    if (Hash::check($current_password, $user->password)) {
        $user->fill([
                'password' => Hash::make($request->newPassword)
            ])->save();
    }
    else{
        return ('Please enter the correct password');
    }
}

我还尝试在用户中设置密码属性..

public function setPasswordAttribute($password) 
{ 
    return $this->attributes['password'] = bcrypt($password); 
}

那没用。 (编辑:然后我删除了上面的属性)如果有的话,它会阻止注册表单(作为 Laravel 的默认身份验证系统的一部分)创建登录表单可识别的密码。

我已检查以确保表单提交的详细信息正确无误。我通过在成功提交表单时从表单输入中转储所有数据来做到这一点。

用户模型:

<?php

命名空间应用; 使用碳\碳;

使用 Illuminate\Foundation\Auth\User 作为可验证的; //使用 App\Http\Controllers\traits\HasRoles;

类用户扩展可验证 {

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'name', 'email', 'password',
];

/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = [
    'password', 'remember_token',
];

//If register dont work or passwords arent being recognised then remove the following:

/* public function setPasswordAttribute($password) 
{ 
    return $this->attributes['password'] = bcrypt($password); 
}*/

//turns dates to carbon
protected $dates = ['created_at'];

     //Creates Many to Many Relationship between Users table (and model) and Roles Table (and model)
public function roles()
{
    return $this->belongsToMany(Roles::class);
}


//Checks for a specific role
public function hasRole($role)
{
    if(is_string($role))
    {
        return $this->roles->contains('name', $role);
    }

    return !! $role->intersect($this->roles)->count();
}

//gives the user the role
public function assignRole($role)
{
    return $this->roles()->save(
        Roles::whereName($role)->firstOrFail()
    );
}

//Checks whether the user has a role with that permission
public function hasPermission($permission)
{
    return $this->hasRole($permission->roles);
}

public function owns($related)
{
    return $this->id === $related->user_id;
}

如您所见,我已经注释掉了密码的属性 setter ,这样应该不会影响它。但它仍然不起作用。

如有任何帮助,我们将不胜感激。

谢谢。

编辑

它不起作用。非常感谢所有做出回应的人,也感谢@Steve Bauman 允许我指出我的错误

工作功能: 公共(public)功能更新密码(UserSecurityFormRequest $request) {

    $user = Auth::user();
    $hashed_password = Auth::user()->password;
    $current_password = $request->input('current_password');
    $new_password = $request->input('password');
    if (Hash::check($current_password, $hashed_password)) {
        $user->fill([
                                'password' => Hash::make($request->password)

            ])->save();
    }
    else{
        return ('Please enter the correct password');
    }
}

最佳答案

找到您的问题:

public function updatePassword(UserSecurityFormRequest $request)
{

    $user = Auth::user();

    $current_password = $request->input('current_password');

    $new_password = $request->input('password');

    if (Hash::check($current_password, $user->password)) {

        $user->fill([

                // This should be $request->password, not `$request->newPassword`

                'password' => Hash::make($request->newPassword)

            ])->save();

    } else {
        return ('Please enter the correct password');
    }
}

请求的变量 newPassword 将为空,这就是您的密码不起作用的原因。您要查找的请求字段是 password

这是因为您的表单字段使用 password 作为输入名称。

关于php - Laravel 5.2 - Authenticated User to Change Password - 更新后密码匹配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39581543/

相关文章:

php - 使用 PDO 预准备语句插入时 MySQL 性能极差

php - 如何使用 Laravel 5 查询生成器编写此查询?

jquery - 阻止用户通过按 Enter 键提交表单

asp.net - Web 表单和带有母版页的 Web 表单之间的区别?

php - 拉拉维尔 : How to located public folder in Laravel?

php - 在扩展服务器时使用不同的时区会产生不利影响吗?

javascript - 在注册页面和感谢页面之间添加一个加载页面

java - 如何使用play框架2绑定(bind)和处理表单中的复选框列表

laravel - 如何从复选框检查laravel设置值变量?

php - Virtual Box MySQL Server VM 不断超时