【问题标题】:change password user laravel 5.3更改密码用户 laravel 5.3
【发布时间】:2017-01-27 21:45:38
【问题描述】:

我想用 laravel 5 创建带有 3 个字段(old_password、new_password、confirm_password)的表单。

查看

旧密码: {!! Form::password('old_password',['class' => 'form-control']) !!}

新密码:{!! Form::password('password',['class' => 'form-control']) !!}

确认新密码:{!! Form::password('verify_password',['class' => 'form-control']) !!}

用户注册时的控制器

public function postRegister(Request $request)
{
    $rules = [
        'email'             =>  'required|email|unique:users',
        'confirm_email'     =>  'required|same:email',
        'password'          =>  'required|min:8|regex:/^(?=\S*[a-z])(?=\S*[!@#$&*])(?=\S*[A-Z])(?=\S*[\d])\S*$/',
        'verify_password'   =>  'required|same:password',
    ];

    $messages = [
        'email.required'            => 'email tidak boleh kosong',
        'password.required'         => 'password tidak boleh kosong',
        'password.min'              => 'Password harus minimal 8 karakter',
        'password.regex'            => 'Format password harus terdiri dari kombinasi huruf besar, angka dan karakter spesial (contoh:!@#$%^&*?><).',
        'verify_password.required'  => 'Verify Password tidak boleh kosong',
        'email.email'               => 'Format Email tidak valid',
        'email.unique'              => 'Email yang anda masukkan telah digunakan',
        'verify_password.same'      => 'Password tidak sama!',
    ];

    $this->validate($request,$rules,$messages);


    $newUser = $this->user->create([
        'email'         =>  $request->email,
        'password'      =>  \Hash::make($request->password),
    ]);
    $this->activationService->sendActivationMail($newUser);

    return redirect('/account/login')->with('success', 'Check your email');
}

我是 laravel 的新手,我读过一些类似的问题来在 stackoverflow 中更改密码,但这对我没有帮助。

我应该如何在我的控制器中为更改密码用户编写代码? 提前致谢。

【问题讨论】:

  • 你可以使用内置的密码控制器。
  • 如果你想手动,你必须研究这个vendor\laravel\framework\src\Illuminate\Foundation\Auth\ResetsPasswords\PasswordController.php页面。

标签: php forms laravel laravel-5


【解决方案1】:

这是更改密码表格

<form id="form-change-password" role="form" method="POST" action="{{ url('/user/credentials') }}" novalidate class="form-horizontal">
  <div class="col-md-9">             
    <label for="current-password" class="col-sm-4 control-label">Current Password</label>
    <div class="col-sm-8">
      <div class="form-group">
        <input type="hidden" name="_token" value="{{ csrf_token() }}"> 
        <input type="password" class="form-control" id="current-password" name="current-password" placeholder="Password">
      </div>
    </div>
    <label for="password" class="col-sm-4 control-label">New Password</label>
    <div class="col-sm-8">
      <div class="form-group">
        <input type="password" class="form-control" id="password" name="password" placeholder="Password">
      </div>
    </div>
    <label for="password_confirmation" class="col-sm-4 control-label">Re-enter Password</label>
    <div class="col-sm-8">
      <div class="form-group">
        <input type="password" class="form-control" id="password_confirmation" name="password_confirmation" placeholder="Re-enter Password">
      </div>
    </div>
  </div>
  <div class="form-group">
    <div class="col-sm-offset-5 col-sm-6">
      <button type="submit" class="btn btn-danger">Submit</button>
    </div>
  </div>
</form>

创建规则

public function admin_credential_rules(array $data)
{
  $messages = [
    'current-password.required' => 'Please enter current password',
    'password.required' => 'Please enter password',
  ];
  
  $validator = Validator::make($data, [
    'current-password' => 'required',
    'password' => 'required',
    'password_confirmation' => 'required|same:password',     
  ], $messages);

  return $validator;
}  

修改密码的用户控制器方法

使用验证器;

public function postCredentials(Request $request)
{
  if(Auth::Check())
  {
    $request_data = $request->All();
    $validator = $this->admin_credential_rules($request_data);
    if($validator->fails())
    {
      return response()->json(array('error' => $validator->getMessageBag()->toArray()), 400);
    }
    else
    {  
      $current_password = Auth::User()->password;           
      if(Hash::check($request_data['current-password'], $current_password))
      {           
        $user_id = Auth::User()->id;                       
        $obj_user = User::find($user_id);
        $obj_user->password = Hash::make($request_data['password']);
        $obj_user->save(); 
        return "ok";
      }
      else
      {           
        $error = array('current-password' => 'Please enter correct current password');
        return response()->json(array('error' => $error), 400);   
      }
    }        
  }
  else
  {
    return redirect()->to('/');
  }    
}

【讨论】:

  • 为什么要检查当前密码是否至少包含 8 个字符?也许用户的密码少于 8 个字符,他需要将其更改为 >= 8。
  • 当然可以,但那是代码可能失败的地方;)
  • 哈哈,很高兴看到你同意了 ;)
  • 然后像这样返回 := return redirect()->back()->withErrors($validator)->withInput();
  • 科马尔做得很好。我不敢相信 Laravel 没有开箱即用的这个功能!毕竟,登录用户可能需要更改密码,就像忘记密码的用户一样! :)
【解决方案2】:

changePassword.blade.php

@extends('layouts.app')

@section('content')
    <!-- header logo: style can be found in header.less -->
    <header class="header">
        <div class="container">
            <div class="row">
                <div class="col-lg-6">
                <a href="index.php" class="logo">
                    <!-- Add the class icon to your logo image or logo icon to add the margining -->
                    <img src="img/airbus-logo.png" />
                </a></div>
                <!-- Header Navbar: style can be found in header.less -->
                <div class="col-lg-6">
                    @include('partials._userModal')
                    @include('partials._menu')
                </div>
            </div>
        </div>
    </header>
    <div class="wrapper">
        <div class="container">
            <!-- Right side column. Contains the navbar and content of the page -->
            <aside class="content files-list clearfix">
                <h2>
                @if(Auth::check())
                Welcome {{ Auth::user()->fullName }}
                @endif
                </h2>
                    <div class="col-xs-5">
                        <h4>Change password</h4><br />
                        @if($errors->any())
                            @foreach($errors->all() as $error)
                                <p style='padding:15px;' class='bg-danger'>{{ $error }}</p>
                            @endforeach
                        @endif
                        @if(Request::get('errorMessage') !== null)
                            <p style='padding:15px;' class='bg-danger'>{{ Request::get('errorMessage') }}</p>
                        @endif
                        <form method="post">
                            {{ csrf_field() }}
                           <div class="placeholder">Current Password</div>
                            <input style="max-width:200px;" placeholder='Current password' name="oldpass" id="oldpass"  class="form-control" type="password"><br>
                            <div class="placeholder">New password</div>
                            <input style="max-width:200px;" placeholder='New password' name="password" id="password"  class="form-control" type="password"><br>
                            <div class="placeholder">Confirm password</div>
                            <input id="password_confirmation" style="max-width:200px;" placeholder='Confirm password' name="password_confirmation"  class="form-control" type="password">
                            <hr>
                            <input type="submit" class="btn btn-primary" value="Save">
                        </form>    
                    </div>
            </aside>
            <!-- /.right-side -->
        </div>
        <div style="  height: 155px;"></div>
        <div id="footer">
            <div class="container"> © Airbus Group 2015 </div>
        </div>
    </div>
    <!-- ./wrapper -->
    <!-- <script src="js/hub/demo.js" type="text/javascript"></script> -->
<script type="text/javascript">
    $(document).ready(function(){
        var bHeight = $("body").height();
        var wHeight = $( window ).height();
        if(bHeight < wHeight){
            $("#footer").addClass("absolute");
        }else{
            $("#footer").removeClass("absolute");
        }
        if (!$.support.htmlSerialize && !$.support.opacity){
            $(".placeholder").show();
        }
    });
</script>
@endsection

控制器发布功能

public function postChangePassword(Request $request)
    {
        $validatedData = $request->validate([
            'oldpass' => 'required|min:6',
            'password' => 'required|string|min:6',
            'password_confirmation' => 'required|same:password',
        ],[
            'oldpass.required' => 'Old password is required',
            'oldpass.min' => 'Old password needs to have at least 6 characters',
            'password.required' => 'Password is required',
            'password.min' => 'Password needs to have at least 6 characters',
            'password_confirmation.required' => 'Passwords do not match'
        ]);

        $current_password = \Auth::User()->password;           
        if(\Hash::check($request->input('oldpass'), $current_password))
        {          
          $user_id = \Auth::User()->id;                       
          $obj_user = User::find($user_id);
          $obj_user->password = \Hash::make($request->input('password'));
          $obj_user->save(); 
          return view('auth.passwords.changeConfirmation');
        }
        else
        {           
          $data['errorMessage'] = 'Please enter correct current password';
          return redirect()->route('user.getChangePassword', $data);
        }  
    }

【讨论】:

    【解决方案3】:

    我在这里解释另一种更改用户密码的方法 changepassword.blade.php

    @extends('layouts.app')
    
    @section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div class="panel-heading">Change password</div>
    
                    <div class="panel-body">
                        @if (session('error'))
                            <div class="alert alert-danger">
                                {{ session('error') }}
                            </div>
                        @endif
                            @if (session('success'))
                                <div class="alert alert-success">
                                    {{ session('success') }}
                                </div>
                            @endif
                        <form class="form-horizontal" method="POST" action="{{ route('changePassword') }}">
                            {{ csrf_field() }}
    
                            <div class="form-group{{ $errors->has('current-password') ? ' has-error' : '' }}">
                                <label for="new-password" class="col-md-4 control-label">Current Password</label>
    
                                <div class="col-md-6">
                                    <input id="current-password" type="password" class="form-control" name="current-password" required>
    
                                    @if ($errors->has('current-password'))
                                        <span class="help-block">
                                            <strong>{{ $errors->first('current-password') }}</strong>
                                        </span>
                                    @endif
                                </div>
                            </div>
    
                            <div class="form-group{{ $errors->has('new-password') ? ' has-error' : '' }}">
                                <label for="new-password" class="col-md-4 control-label">New Password</label>
    
                                <div class="col-md-6">
                                    <input id="new-password" type="password" class="form-control" name="new-password" required>
    
                                    @if ($errors->has('new-password'))
                                        <span class="help-block">
                                            <strong>{{ $errors->first('new-password') }}</strong>
                                        </span>
                                    @endif
                                </div>
                            </div>
    
                            <div class="form-group">
                                <label for="new-password-confirm" class="col-md-4 control-label">Confirm New Password</label>
    
                                <div class="col-md-6">
                                    <input id="new-password-confirm" type="password" class="form-control" name="new-password_confirmation" required>
                                </div>
                            </div>
    
                            <div class="form-group">
                                <div class="col-md-6 col-md-offset-4">
                                    <button type="submit" class="btn btn-primary">
                                        Change Password
                                    </button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
    @endsection
    

    这是 web.php 中的路由

    Route::post('/changePassword','HomeController@changePassword')->name('changePassword');
    

    控制器方法

    public function changePassword(Request $request){
    
            if (!(Hash::check($request->get('current-password'), Auth::user()->password))) {
                // The passwords matches
                return redirect()->back()->with("error","Your current password does not matches with the password you provided. Please try again.");
            }
    
            if(strcmp($request->get('current-password'), $request->get('new-password')) == 0){
                //Current password and new password are same
                return redirect()->back()->with("error","New Password cannot be same as your current password. Please choose a different password.");
            }
    
            $validatedData = $request->validate([
                'current-password' => 'required',
                'new-password' => 'required|string|min:6|confirmed',
            ]);
    
            //Change Password
            $user = Auth::user();
            $user->password = bcrypt($request->get('new-password'));
            $user->save();
    
            return redirect()->back()->with("success","Password changed successfully !");
    
        }
    

    我已关注该链接:- https://www.5balloons.info/setting-up-change-password-with-laravel-authentication/

    【讨论】:

    • 谢谢你,这些是你提到的教程中缺少的代码sn-ps。所有这些都为我提供了 Laravel 5.7 的一个很好的解决方案
    • 这个很适合我。谢谢! ???
    • 感谢兄弟,它成功了!不要忘记在你的控制器中导入这些类:使用 Illuminate\Support\Facades\Hash;使用 Illuminate\Support\Facades\Auth;
    【解决方案4】:

    这就是我使用 Laravel 5.8 的方式:

    查看

    确认密码必须是这样的:

    {!! Form::password('password_confirmation', ['class' => 'form-control'']) !!}
    

    因为 Laravel 提供了一个字段 confirmed rule

    创建一个表单请求并将其放入规则部分:

    use App\Rules\IsCurrentPassword;
    
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'old_password' => ['required', new IsCurrentPassword],
            'password' => 'required|string|min:6|confirmed',
        ];
    }
    

    让我们使用 artisan 来生成一个规则来验证 old_password 是否是真正的当前密码:

    php artisan make:rule IsCurrentPassword
    

    并将其放入规则生成的passes方法中:

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $current_password = auth()->user()->password;
        return Hash::check($value, $current_password);
    }
    

    别忘了导入Hash:

    use Illuminate\Support\Facades\Hash;
    

    控制器

    您需要在控制器中执行以下操作:

    auth()->user()->update([
        'password' => Hash::make($request->password)
    ]);
    

    还有 tada :) 希望我能帮上忙。

    【讨论】:

      【解决方案5】:

      Laravel 6 Check Old Password and Updating a New Password

      public function updatePassword(Request $request)
          {
              $this->validate($request, [
                  'old_password'     => 'required',
                  'new_password'     => 'required|min:6',
                  'confirm_password' => 'required|same:new_password',
              ]);
      
              $data = $request->all();
      
              if(!\Hash::check($data['old_password'], auth()->user()->password)){
      
                   return back()->with('error','You have entered wrong password');
      
              }else{
      
                 here you will write password update code
      
              }
          }
      

      【讨论】:

        【解决方案6】:

        您也可以使用此代码重置密码。

        public function passwordReset(Request $request)
        {
            $input = $request->all();
            $validated = $request->validate(
                [
                    'current_password' => 'required',
                    'password' => 'required|confirmed'
                ]
            );
            //Change Password
            $username = Auth::user();
            $name = $username->username;
            $currentpassword = $input['current_password'];
            $password = $input['password'];
            $result = DB::table('user_security')
                ->where('username', $name)
                ->get();
        
            $cpassword =  $result[0]->password;
            if (Hash::check($currentpassword, $cpassword)) {
                $insert = DB::table('user_security')
                    ->where('username', $name)
                    ->update([
                        'password' =>  Hash::make($password)
                    ]);
                return redirect('viewprofile');
            } else {
                return redirect('changepassword');
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-03-26
          • 2016-05-29
          • 1970-01-01
          • 1970-01-01
          • 2017-03-14
          • 1970-01-01
          • 2017-09-28
          • 2017-12-07
          • 2020-01-21
          相关资源
          最近更新 更多