php - laravel 在尝试登录时返回 false 以获得正确的凭据
问题描述
在laravel "^7.11.0"
我的自定义登录没有任何问题,当我将其更新到新版本时,此代码返回 false:
//LoginController.php
$this->attemptLogin($request)
//trait AuthenticatesUsers.php
protected function attemptLogin(Request $request)
{
return $this->guard()->attempt(
$this->credentials($request), $request->filled('remember')
);
}
但作为7.11.0
回报true
,我不知道laravel "^7.28.3"
返回 false 的新版本会发生什么,这导致我无法更新laravel
:
我的自定义登录:
<?php
namespace App\Http\Controllers\Auth;
use App\Events\UserAuthenticate;
use App\Http\Controllers\Controller;
use App\User;
use Carbon\Carbon;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Laravel\Socialite\Facades\Socialite;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/';
public function __construct()
{
$this->middleware('guest')->except('logout');
}
public function login(Request $request)
{
$this->validateLogin($request);
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
return $this->sendLockoutResponse($request);
}
if (auth()->validate($request->only('username','password'))) {
$user = User::whereUsername($request->username)->first();
if ($user->lock) {
$request->session()->flash('error',__('message.your_account_locked'));
return view('layouts.backend.pages.auth.account.locked_account');
}elseif (!$user->active) {
$checkActivationCode = $user->activationCode()->where('expire', '>=', Carbon::now())->latest()->first();
if ($checkActivationCode != null) {
if ($checkActivationCode->expire > Carbon::now()) {
$this->incrementLoginAttempts($request);
$request->session()->flash('error',__('message.please_active_your_account'));
return view('layouts.backend.pages.auth.account.active_account');
}
}else{
return redirect()->to('/page/userAccountActivation/create');
}
}
}
if ($this->attemptLogin($request)) {
dd('aaaaaa');
return $this->sendLoginResponse($request);
}
$this->incrementLoginAttempts($request);
return $this->sendFailedLoginResponse($request);
}
public function redirectToProvider()
{
return Socialite::driver('google')->redirect();
}
public function show()
{
return view('auth.login');
}
protected function validateLogin(Request $request)
{
$this->validate($request, [
'username' => 'required|string',
'password' => 'required|string',
'g-recaptcha-response', 'recaptcha'
]);
}
}
解决方案
用于凭证的默认字段是email
并且password
您应该在 上定义一个username
方法,LoginController
以便该方法在调用它以使用与凭证中的用户名字段不同的字段credentials
时提取正确的凭证:attemptLogin
email
“默认情况下,Laravel 使用该
username
在你的 : 上定义一个方法LoginController
” - Laravel 7.x Docs
public function username()
{
return 'username';
}
附带说明一下,在auth()->validate(...)
您拥有来自身份验证系统的用户之后,您可以从那里自己登录:
if ($this->guard()->validate(....)) {
$user = $this->guard()->user();
...
$this->guard()->login($user, $remember);
return $this->sendLoginResponse($request);
}
除非您正在侦听Illuminate\Auth\Events\Attempting
事件或此时Illuminate\Auth\Events\Failed
不需要调用的事件,否则attemptLogin
您已经完成了警卫attempt
方法的工作(减去这两个事件)。
推荐阅读
- java - Spring Boot 在作为 Servlet 但不能作为命令行运行时可以连接到 Cassandra
- c++ - 在其他基类中重新定义虚函数
- sql - 根据标志添加/删除 SQL 查询中的两个重复结果
- java - 将文本框的标签放在框上方而不是侧面
- openssl - openssl s_server 是否支持 LDAP starttls 功能?
- javascript - 当从 div 中单击记录时,它必须将所选记录显示到另一个 div
- swift - 更新 pod 后出现“使用未声明的标识符 '__BYTE_ORDER'”错误
- sql - 我可以定义一组表以供以后处理吗?
- java - 如何将 HttpServletRequest 转换为 OAuth2Request 对象?
- ruby - RSpec - 如何测试是否调用了不同的类方法?