如果密码少于6个字符,Laravel 5重置密码表单不提交


Laravel 5 reset password form not submitting if password is less than 6 characters

我正在尝试重置密码,但如果密码长度小于6,则无法重置密码。我正在验证min:4验证中提交的密码,但当我输入超过4个字符的表单时,它不会提交,但当尝试使用超过6个字符时,它会起作用。

知道我的代码出了什么问题吗。

这是我的HTML:

<div class="reset_password_container">
    <div class="reset_bg">
        <form class="form-horizontal" role="form" method="POST" action="{{ url('/password/reset') }}">
            <input type="hidden" name="_token" value="{{ csrf_token() }}">
            <input type="hidden" name="token" value="{{ $token }}">
            <div class="find_account_container">
                <div class="find_inner_logo">
                    <h5>{{ trans('messages.reset_password_form.reset_password') }}</h5>
                </div>
                <div class="find_form_dv">
                    <div class="reset_para_dv">
                        <p>{{ trans('messages.reset_password_form.text_1') }}</p>
                        <div class="reset_email_dv">
                            <p>{{ trans('messages.reset_password_form.email') }} <a href="javascript:void(0);">{{ $email }}</a></p>
                        </div>
                    </div>
                    <div class="reset_form_dv">
                        <input type="hidden" class="txt" name="ID" value="{{ $email }}">
                        <input type="password" class="txt" name="password" value="{{ old('password') }}" placeholder="{{ trans('messages.reset_password_form.password') }}">
                        <p class="error"></p>
                        <input type="password" class="txt" name="password_confirmation" value="{{ old('password_confirmation') }}" placeholder="{{ trans('messages.reset_password_form.password_confirmation') }}">
                        <p class="error">
                            @if ($errors->has('password'))
                                {{ $errors->first('password') }}
                            @endif
                        </p>
                    </div>
                </div>
            </div>
            <div class="reset_footer_bg">
                <div class="rest_btn_bg">
                    <button type="submit" class="btn btn-primary">{{ trans('messages.reset_password_form.confirm') }}</button>
                </div>
            </div>
        </form>
    </div>
</div>

密码控制器.php

<?php
namespace App'Http'Controllers'Auth;
use Illuminate'Http'Request;
use Illuminate'Mail'Message;
use Illuminate'Support'Facades'Auth;
use Illuminate'Support'Facades'Password;
use App'Http'Controllers'Controller;
use Illuminate'Foundation'Auth'ResetsPasswords;
use Illuminate'Support'Facades'Input;
use Mail;
use DB;

class PasswordController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Password Reset Controller
    |--------------------------------------------------------------------------
    |
    | This controller is responsible for handling password reset requests
    | and uses a simple trait to include this behavior. You're free to
    | explore this trait and override any methods you wish to tweak.
    |
    */
    use ResetsPasswords;
    /**
     * Create a new password controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        //$this->middleware('guest');
    }
    /**
     * Get the post register / login redirect path.
     *
     * @return string
     */
    public function redirectPath()
    {
        if (property_exists($this, 'redirectPath')) {
            return $this->redirectPath;
        }
        return property_exists($this, 'redirectTo') ? $this->redirectTo : '/dashboard';
    }
    /**
     * Display the password reset view for the given token.
     *
     * @param  string  $token
     * @return 'Illuminate'Http'Response
     */
    public function getReset($token = null, Request $request)
    {
        if (is_null($token)) {
            throw new NotFoundHttpException;
        } else {
            $userReset = DB::table('password_resets')->select('email')->where('token','=',$token)->get();
        }
        if (!empty($userReset)) {
            return view('auth.reset')->with('token', $token)->with('email', $userReset[0]->email);
        } else {
            return redirect('/');
        }
    }
    /**
     * Send a reset link to the given user.
     *
     * @param  'Illuminate'Http'Request  $request
     * @return 'Illuminate'Http'Response
     */
    public function postEmail(Request $request)
    {
        //Input::get('ID') die;
        $this->validate($request, ['ID' => 'required|email']);
        // Pass data to reset password mail template
        view()->composer('emails.password', function($view) {
            $view->with([
                'Nickname'   => Input::get('nickname'),
            ]);
        });
        $response = Password::sendResetLink($request->only('ID'), function (Message $message) {
            $message->subject('비밀번호 재설정 안내');
            //$message->subject($this->getEmailSubject());
        });
        if ($response == "passwords.sent") {
            $html = '<div class="img_left_dv"><img src="resources/assets/front/images/suggestion_2.png" alt=""/></div>
            <div class="text_right_dv">
                <h3>'.Input::get('nickname').'</h3>
                <p><a href="javascript:void(0);">'.Input::get('ID').'</a> '.trans('messages.reset_password_popup.confirmation_message').'</p>
            </div>';
            echo $html;
        }
    }
    /**
     * Reset the given user's password.
     *
     * @param  'Illuminate'Http'Request  $request
     * @return 'Illuminate'Http'Response
     */
    public function postReset(Request $request)
    {
        $this->validate($request, [
            'token' => 'required',
            'ID' => 'required|email',
            'password' => 'required|min:4|confirmed',
            'password_confirmation' => 'required|same:password|min:4'
        ]);
        $credentials = $request->only(
            'ID', 'password', 'password_confirmation', 'token'
        );
        $response = Password::reset($credentials, function ($user, $password) {
            $this->resetPassword($user, $password);
        });
        switch ($response) {
            case Password::PASSWORD_RESET:
                return redirect($this->redirectPath())->with('status', trans($response));
            default:
                return redirect()->back()
                            ->withInput($request->only('ID'))
                            ->withErrors(['ID' => trans($response)]);
        }
    }
}

请尝试以下功能:

默认情况下,Password::reset方法将验证密码是否匹配,并且>=六个字符。您可以使用Password::validator方法自定义这些规则,该方法接受闭包。在此闭包中,您可以根据需要进行任何密码验证。请注意,您不需要验证密码是否匹配,因为这将由框架自动完成。

Password::validator(function($credentials)
{
    return strlen($credentials['password']) >= 4;
});

postReset中的验证规则被Illuminate'Foundation'Auth'ResetsPasswords.php:中的getResetValidationRules函数取代

protected function getResetValidationRules()
{
    return [
        'token' => 'required',
        'email' => 'required|email',
        'password' => 'required|confirmed|min:6',
    ];
}

要解决此问题,您需要:

  • getResetValidationRules函数添加到PasswordController.php文件中
  • 删除您创建的postReset函数(这只是复制已经存在的代码)
  • ID表单字段重命名为email,并让Laravel处理其余部分

所以,PasswordController.php应该只包含:

<?php
namespace App'Http'Controllers'Auth;
use App'Http'Controllers'Controller;
use Illuminate'Foundation'Auth'ResetsPasswords;
class PasswordController extends Controller
{
    use ResetsPasswords;
    /**
     * Create a new password controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }
    public function getResetValidationRules()
    {
        return [
            'token' => 'required',
            'email' => 'required|email',
            'password' => 'required|confirmed|min:4',
        ];
    }
}

我在Laravel 5.2中注意到了同样的问题。重置密码表单需要六个或更多字符的密码,并且在两个位置都是这样设置的。

1.PasswordBroker类vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBroker.php:validatePasswordWithDefaults()

    protected function validatePasswordWithDefaults(array $credentials)                                                      
{   
    list($password, $confirm) = [
        $credentials['password'],
        $credentials['password_confirmation'],
    ];
    return $password === $confirm && mb_strlen($password) >= 6;
}

2.重置密码属性vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php:getResetValidationRules()

    protected function getResetValidationRules()
{   
    return [
        'token' => 'required',
        'email' => 'required|email',
        'password' => 'required|confirmed|min:6',
    ];  
}   

通过实现自己的reset()getResetValidationRules()方法,可以很容易地覆盖app/Http/Controllers/Auth/PasswordController.php中的getResetValidationRules() trait方法。

然而,为了调用您自己的PasswordBroker.php:validatePasswordWithDefaults()方法,似乎需要扩展PasswordBroker和PasswordBrokerManager,并且由于它是由vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordResetServiceProvider.php初始化的,因此您也需要扩展它。完成所有操作后,您可以在Laravel的服务容器中初始化新的"CustomPasswordResetServiceProvider",就像ResetPasswordServiceProvider一样。

您可以使用此要点来解决问题。您必须创建一个新的服务提供商,使用您的自定义密码代理管理器。当每件事都设置好后,你所要做的就是将你的新服务提供商添加到你的config''app.hp:中

'providers' => [
     ...
     // path to your PasswordResetServiceProvider
     App'Auth'PasswordResetServiceProvider::class 
 ]