【问题标题】:Laravel 8 prevent logout after user password change?Laravel 8 防止用户密码更改后注销?
【发布时间】:2021-01-11 15:56:33
【问题描述】:

我有一个管理面板,我目前正在处理更改密码模块。我已经完成了更改密码的代码,但由于某种原因会话被破坏并且用户在更改密码后注销。如何防止发生自动注销。请帮帮我。

HTML

<form id="changepasswordform">
    <input type="hidden" name='_token' value="{{ csrf_token() }}">
    <div class="form-group">
        <div class="row">
            <div class="col-md-2">
                <label>Password</label>
            </div>
        <div class="col-md-10">
            <div class="custom_error_msg password_error"></div>
            <input type="password" name="password" class="form-control password">
        </div>
        </div>
    </div>
    <div class="form-group">
        <div class="row">
            <div class="col-md-2">
                <label>Confirm Password</label>
            </div>
            <div class="col-md-10">
                <div class="custom_error_msg confirm_password_error"></div>
                <input type="password" name="confirm_password" class="form-control confirm_password">
            </div>
        </div>
    </div>
    <div class="form-group">
        <div class="row">
            <div class="col-md-12">
                <button class="btn btn-success float-right"><i class="far fa-save"></i> Save</button>
            </div>
        </div>
    </div>
</form>

控制器

public function ChangePasswordProcess(Request $request){
    /*User::find(auth()->user()->id)
    ->update([
        'password'=> Hash::make($request->password)
    ]);*/
    $userId = Auth::User()->id;
    $user = User::find($userId);
    $user->password = Hash::make($request->password);
    $user->save();
    
    return response()->json(['status' => 'success']);
}

Javascript

<script>
    $(document).ready(function(){
        $(".dropify").dropify();
        $("#changepasswordform").submit(function(e){
            e.preventDefault();
            var status=false;

            if($(".password").val()==""){
                $(".password_error").html("Field is mandatory");
                $(".password_error").show();
                status=false;
            } else {
                $(".password_error").hide();
                status=true;
            }

            if($(".confirm_password").val()==""){
                $(".confirm_password_error").html("Field is mandatory");
                $(".confirm_password_error").show();
                status=false;
            } else {
                $(".confirm_password_error").hide();
                status=true;
            }

            if($(".password").val()!=="" && $(".confirm_password").val()!==""){
                if($(".password").val() !== $(".confirm_password").val()){
                    $(".confirm_password_error").html("Passwords don't match");
                    $(".confirm_password_error").show();
                    status=false;
                } else {
                    $(".confirm_password_error").hide();
                    status=true;
                }
            }

            if(status==true){
                var formdata = new FormData(document.getElementById('changepasswordform'));
                $.ajax({
                    url: "{{ route('admin.change_password_process') }}",
                    type: "post",
                    async: false,
                    cache: false,
                    contentType: false,
                    processData: false,
                    data: formdata,
                    success: function (res) {
                        if (res.status == 'success') {
                            Swal.fire({
                                icon: 'success',
                                title: 'Success',
                                text: 'Password updated successfully',
                                confirmButtonClass: 'btn btn-primary',
                                buttonsStyling: false,
                            }).then(function (result) {
                                window.location.reload();
                            });
                        }
                    }
                });
            }               
        });
    });
</script>

【问题讨论】:

  • @Quantumass 我看到了这个,但是已经在那里尝试了一些答案,但是没有用。您还有其他建议吗?
  • 你把Auth::login($user);放在哪里了?你能告诉我更新的代码吗?
  • 其实我不知道怎么做,你能写一个答案吗?
  • 好的,我发布了一个答案,你可以试试吗

标签: laravel laravel-8


【解决方案1】:

在控制器中的ChangePasswordProcess方法上,您必须重新验证密码更改的用户

public function ChangePasswordProcess(Request $request){
    /*User::find(auth()->user()->id)
    ->update([
        'password'=> Hash::make($request->password)
    ]);*/
    $userId = Auth::User()->id;
    $user = User::find($userId);
    $user->password = Hash::make($request->password);
    $user->save();

    Auth::login($user);
    
    return response()->json(['status' => 'success']);
}

【讨论】:

    【解决方案2】:

    当 session 的 password_hash 不同于当前的auth()-&gt;user() 时,laravel 会自动注销用户。这是在这个中间件上完成的:

    vendor/laravel/framework/src/Illuminate/Session/Middleware/AuthenticateSession.php

    如果您使用新的哈希密码更新会话中的 password_hash,用户将不会注销。

    session()->put([
       'password_hash_' . auth()->getDefaultDriver() => $user->getAuthPassword()
    ]);
    

    例子:

    session()->put([
       'password_hash_web' => "$2y$10$...hashpasswordstoredondatabase"
    ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-28
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 2021-12-03
      • 2021-08-28
      相关资源
      最近更新 更多