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

Posted

技术标签:

【中文标题】Laravel 更新密码通过验证但不更新记录【英文标题】:Laravel update password passes validation but doesn't update record 【发布时间】:2015-04-08 14:38:13 【问题描述】:

您好,我正在使用 Laravel,我正在为用户身份验证和角色使用几个包,它们是 Zizaco Confide,我想首先更新用户密码,他们应该在那里输入当前密码和新密码并确认密码,然后他们应该匹配。现在验证有效,但用户密码未在数据库中更新。我的代码如下:

public function updatePassword($id) 

     $rules = array(
        'now_password'          => 'required',
        'password'              => 'min:5|confirmed|different:now_password',
        'password_confirmation' => 'required_with:password|min:5'
        );
        //password update.
        $now_password       = Input::get('now_password');
        $password           = Input::get('password');
        $passwordconf       = Input::get('password_confirmation');

        $validator = Validator::make(Input::only('now_password', 'password', 'password_confirmation'), $rules);                  

      if ($validator->fails())     
                return Redirect::back()->withErrors($validator);
            
        elseif (Hash::check($now_password, Auth::user()->password)) 

                    $user = User::find($id);
                    $user->password = Hash::make($password);
                    $user->save();
          return Redirect::back()->with('success', true)->with('message','User updated.');

             else  
                return Redirect::back()->withErrors('Password incorrect');
            



没有使用此代码块更新用户密码的任何想法

$user = User::find($id);
$user->password = Hash::make($password);
$user->save();

用户模型

<?php

use Zizaco\Confide\ConfideUser;
use Zizaco\Confide\ConfideUserInterface;
use Zizaco\Entrust\HasRole;

class User extends Eloquent implements ConfideUserInterface

    use SoftDeletingTrait;
    use ConfideUser;
    use HasRole;

    protected $softDelete = true;

    public function favourites()
    
        return $this->hasMany('Favourite');
    



【问题讨论】:

它的逻辑很好,但你在控制器功能中有太多事情要做。您应该将该逻辑提取到存储库或服务提供商中。 您使用的是标准用户模型 - 还是其他模型?那里有任何验证或变异器吗?也许发布您的用户模型... 你怎么知道密码没有更新? 我正在使用 confide 模型,因为我注销并尝试了新密码,但尝试旧密码失败,但它成功了。多次尝试。 不提供更新密码的方法吗? 【参考方案1】:

检查输入的密码:

1.

 $now_password  = Input::get('now_password');
 $user = DB::table('users')->where('name', Auth::user()->name)->first();
        if(Hash::check($now_password, $user->password))
    //Your update here

2.

$now_password   = Input::get('now_password');
if(Hash::check($now_password, Auth::user()->password))
    //Your update here

检查它们是否匹配以及新密码是否与旧密码不同。

$rules = array(
        'now_password'          => 'required|min:8',
        'password'              => 'required|min:8|confirmed|different:now_password',
        'password_confirmation' => 'required|min:8',
    );

并将您的表单编辑为(或输入您的姓名):

 Form::label('now_password', 'Old Password') 
 Form::password('now_password')
 Form::label('password', 'New Password') 
 Form::password('password')
 Form::label('password_confirmation', 'Confrim New Password') 
 Form::password('password_confirmation')

更新

好的,所以您不想只编辑密码。

编辑你的规则:

$rules = array(
'now_password'          => 'required|min:5',
'password'              => 'min:5|confirmed|different:now_password',
'password_confirmation' => 'required_with:password|min:5'
);

我认为在每种类型的更改中都应该需要当前密码。 imo 不需要其他输入,因为您不知道要编辑哪个数据用户。

您还应该在规则中添加如下内容:

'username'  => alpha_num|unique:users,username

等..(更多信息请参阅http://laravel.com/docs/4.2/validation#available-validation-rules)

如果验证器通过,您应该检查哪些数据用户想要更改(哪些输入不为空)。 比如:

if(!empty(Input::get('firstname')))
    $user->firstname    = Input::get('firstname');

等等...每个输入。

【讨论】:

我已经用你的例子修改了我的答案,因为它不适合我 谢谢。验证端正在工作,但实际上并未更新密码并显示成功消息。我正在更新:$user = User::find($id); $user-&gt;password = Hash::make($password); $user-&gt;save(); 有什么想法吗?我用新功能更新了我的问题 检查“纯更新”是否有效 - DB::table('users')-&gt;where('id', User::find($id))-&gt;update(array('password' =&gt; Hash::make($password))); 也许你的模型有问题,然后我们会更深入...... 不,这也不起作用。有什么建议?就模型而言,我为此使用了github.com/Zizaco/confide 包。我有一个更新用户名和电子邮件字段的功能,所以奇怪的是密码不会更新 你能告诉我们你的用户模型中的 $guarded 和 $fillable 数组吗?【参考方案2】:

试试这样:

public function updatePassword($id)

    $user = User::findOrFail($id);

    User::$rules['now_password'] = 'required';
    // other rules here

    $validator = Validator::make($data = Input::all(), User::rules('update', $id));

    if ($validator->fails())
    
        return Redirect::back()->withErrors($validator)->withInput();
    

    array_forget($data, 'password_confirmation');
    array_forget($data, 'now_password');

    $data['password'] = Hash::make($data['password']);

    $user->update($data);

    return Redirect::back()->with('success', true)->with('message','User updated.');

【讨论】:

我收到一个错误Access to undeclared static property: User::$rules【参考方案3】:

如果您使用第一种方式,请记住您的密码确认字段名称必须是“password_confirmation”... 如果您在密码确认字段中使用了其他名称,则可以使用第二种方式。

$this->validate($request, [
            'email'    => 'required|unique:user|email|max:255',
            'username' => 'required|max:20',
            'password' => 'required|min:3|confirmed',
            'password_confirmation' => 'required',
            'gender' => 'required|in:m,f',
        ]);

$this->validate($request, [
            'email'    => 'required|unique:user|email|max:255',
            'username' => 'required|max:20',
            'password' => 'required|min:3',
            'confirm_password' => 'same:password',
            'gender' => 'required|in:m,f',
        ]);

【讨论】:

【参考方案4】:
public function change_password_post($id)
    
        $rules = array(
                    'current'       =>  'required|string|min:8',
                    'new'       =>  'required|string|min:8',
                    'confirm'       =>  'required|same:new'
                    );

        $validator = Validator::make(Input::only('current', 'new', 'confirm'), $rules);

        if($validator->fails())
        
            return Redirect::back()
                ->withErrors($validator);
        
else
            
                $users = User::where('id', '=', $id)->first();

                if (Hash::check(Input::get('current'), $users->password))
                
                    if(Input::get('new') == Input::get('confirm'))
                    
                        $users->password =Hash::make(Input::get('new'));
                        $users->save();

                        $msg = array('msg' => 'Password changed Successfully');

                        return Redirect::back()
                            ->withErrors($msg);
                    
                    else
                    
                        $msg = array('msg' => 'New password and Confirm password did not match');

                        return Redirect::back()
                                ->withErrors($msg);
                    
                
                else
                
                    $msg = array('msg' => 'Current password is incorrect');

                    return Redirect::back()
                        ->withErrors($msg);
                
        
    

【讨论】:

以上是关于Laravel 更新密码通过验证但不更新记录的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 - 经过身份验证的用户更改密码 - 更新后的密码匹配问题

laravel 5,更新用户密码

如何验证记录更新中的唯一字段

Laravel Slug 更新记录

通过索引 Laravel 5 从集合中获取项目

如何为 8.x 版本更新 Laravel 安装程序?