Laravel- Auth::check returns false 在中间件中登录成功
Laravel- Auth::check returns false in the middleware for successfull login
我的登录控制器
public function authenticate(Request $request)
{
$credentials = $request->validate([
'username' => ['required'],
'password' => ['required'],
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('/');
}
return back()->withErrors([
'error' => 'The provided credentials do not match our records.',
]);
}
我检查授权的中间件
class AuthorizeUser
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if (Auth::check()) {
return $next($request);
} else {
return view('application');
}
}
}
Auth::check()
在此中间件 returns 错误事件中 Auth::attempt
成功。
如何找到此问题的原因?
检查您的用户数据库的 primary key
。如果您设置 table 的主键而不是 id,则需要在您的用户模型中进行设置。
Laravel 文档说明如下:
Eloquent will also assume that each table has a primary key column named id. You may define a protected $primaryKey property to override this convention.
例如,如果您将 user_id 列设置为用户数据库中的主键,则需要在用户模型中放置以下代码:
protected $primaryKey = 'user_id';
你在auth.php使用过守卫吗?
这是你的默认守卫吗?
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
将你的路由放在 Auth 或 Web 的中间件中就可以了。
您可以在 routes/api 中使用此代码。php
Route::post('your-route-here', [ControllerNameHere::class,'FunctionNameHere'])->name('Route-Name-Here')->middleware('api');
或者您可以在 routes/web.php
中使用
Route::post('your-route-here', [ControllerNameHere::class,'FunctionNameHere'])->name('Route-Name-Here')->middleware('web');
改用RedirectIfAuthenticated
中间件:
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null ...$guards
* @return mixed
*/
public function handle(Request $request, Closure $next, ...$guards)
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
}
}
return $next($request);
}
谢谢大家的支持。问题出在我的会话配置上。
我之前将会话驱动程序设置为数据库并更改了会话名称。
我用默认配置替换了 session.php 和 .env 。然后上面的代码完美运行。 (我想会话配置出了点问题,当我有时间回顾那个问题时我会继续发布)
我的登录控制器
public function authenticate(Request $request)
{
$credentials = $request->validate([
'username' => ['required'],
'password' => ['required'],
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->intended('/');
}
return back()->withErrors([
'error' => 'The provided credentials do not match our records.',
]);
}
我检查授权的中间件
class AuthorizeUser
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if (Auth::check()) {
return $next($request);
} else {
return view('application');
}
}
}
Auth::check()
在此中间件 returns 错误事件中 Auth::attempt
成功。
如何找到此问题的原因?
检查您的用户数据库的 primary key
。如果您设置 table 的主键而不是 id,则需要在您的用户模型中进行设置。
Laravel 文档说明如下:
Eloquent will also assume that each table has a primary key column named id. You may define a protected $primaryKey property to override this convention.
例如,如果您将 user_id 列设置为用户数据库中的主键,则需要在用户模型中放置以下代码:
protected $primaryKey = 'user_id';
你在auth.php使用过守卫吗? 这是你的默认守卫吗?
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
将你的路由放在 Auth 或 Web 的中间件中就可以了。
您可以在 routes/api 中使用此代码。php
Route::post('your-route-here', [ControllerNameHere::class,'FunctionNameHere'])->name('Route-Name-Here')->middleware('api');
或者您可以在 routes/web.php
中使用 Route::post('your-route-here', [ControllerNameHere::class,'FunctionNameHere'])->name('Route-Name-Here')->middleware('web');
改用RedirectIfAuthenticated
中间件:
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null ...$guards
* @return mixed
*/
public function handle(Request $request, Closure $next, ...$guards)
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
}
}
return $next($request);
}
谢谢大家的支持。问题出在我的会话配置上。 我之前将会话驱动程序设置为数据库并更改了会话名称。 我用默认配置替换了 session.php 和 .env 。然后上面的代码完美运行。 (我想会话配置出了点问题,当我有时间回顾那个问题时我会继续发布)