【问题标题】:How to validate password to check if it is the same password as in database?如何验证密码以检查它是否与数据库中的密码相同?
【发布时间】:2020-11-27 21:13:05
【问题描述】:

我在 Laravel 中有使用电子邮件和密码登录网站的登录表单。我已经进行了所有验证,除了密码之外一切正常。当我输入错误的密码时,它会进入空白页,我想在密码字段下写一些错误。我看了同样的:密码验证,但它不起作用。任何帮助表示赞赏。这是我的代码。

登录控制器.php

public function login(Request $request)
{
    $rules = [
        'email'    => 'required|email|exists:App\User,email', 
        'password' => 'required|alphaNum|min:5'
    ];

    $validator = Validator::make($request->all(), $rules);

    if ($validator->fails()) {
        $request->session()->put('data', $request->input());
        return redirect()->route('login')
            ->withErrors($validator->errors())
            ->withInput($request->session()->put('data', $request->input()));
    } else {
        $userData = array(
            'email'     => $request->get('email'),
            'password'  => $request->get('password')
        );
    }
    
    if (Auth::attempt($userData)) {
        return redirect()->route('dashboard');
    } else {        
        redirect()->route('login');
    }
}

login.blade.php

<div class="login-page">
    <div class="login-box">
        <div class="card mb-0">
            <div class="card-body login-card-body">
                <p class="login-box-msg font-weight-bold">Sign in to start your session</p>
                <form method="POST" class="mb-4" action="{{route('login') }}">
                    @csrf
                    <div class="input-group mb-3">
                        <input id="email" type="email" placeholder="Email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
                        <div class="input-group-append">
                            <div class="input-group-text">
                                <span class="fas fa-user"></span>
                            </div>
                        </div>
                        @error('email')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                        @enderror
                    </div>
                    <div class="input-group mb-3">
                        <input id="password" type="password" placeholder="Password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
                        <div class="input-group-append">
                            <div class="input-group-text">
                                <span class="fas fa-eye-slash cursor-pointer" style="display: none" onclick="showPassword()"></span>
                                <span class="fas fa-eye cursor-pointer" onclick="showPassword()"></span>
                            </div>
                        </div>
                        @error('password')
                        <span class="invalid-feedback" role="alert">
                            <strong>{{ $message }}</strong>
                        </span>
                        @enderror
                    </div>
                    <div class="float-right">
                        <button type="submit" class="btn btn-primary btn-block font-weight-bold">Sign In</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>

【问题讨论】:

  • 您也可以为您的登录视图添加代码吗?
  • @Unflux 在这里
  • 您需要在存储之前对密码进行哈希处理。
  • 您为什么要首先针对数据库验证密码?这样您就可以知道他们是否因为“电子邮件”或“密码”而无法登录?
  • 所以现在攻击者会知道一个电子邮件地址存在(是真实的)并且现在可以专注于密码 ;-) 但这可能会或可能不会让您担心,只是指出这一点

标签: php laravel validation


【解决方案1】:

假设您的电子邮件是unique,您首先必须获取$request-&gt;email 所在的数据库行:$user = User::where('email', $request-&gt;email)-&gt;first()

然后您可以使用以下方式进行检查:Hash::check($request-&gt;password, $user-&gt;password)

https://laravel.com/docs/7.x/hashing

@编辑

要将其添加到规则中,您必须创建一个规则类:php artisan make:rule myRuleName 之后你会这样称呼它:

$rules = [
        'email'    => 'required|email|exists:App\User,email', 
        'password' => ['required','alphaNum','min:5', new myRuleName()],
    ];

在您的自定义规则类中,您会找到一个passes($attribute, $value)function。 现在你可以将我上面写的代码插入到这个方法中。您必须将 $request-&gt;password 替换为 $value

【讨论】:

  • 我在编写代码时遇到了麻烦。我应该如何将它添加到 $rules 变量中?
  • 我只重定向到登录页面没有消息
  • 我不确定为什么不显示错误。但是您需要发布另一个问题,因为这是另一个问题。
  • 我会在一分钟内
猜你喜欢
  • 2016-01-06
  • 2017-01-17
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2020-07-03
  • 2014-12-29
相关资源
最近更新 更多