Laravel身份验证,我无法检索登录用户
Posted
技术标签:
【中文标题】Laravel身份验证,我无法检索登录用户【英文标题】:Laravel authentication, I can't retrieve the logged in user 【发布时间】:2016-09-25 00:58:30 【问题描述】:Auth::check()
总是返回 false。这很奇怪,因为登录功能将我重定向到 $redirectTo url,因此尝试成功,但在我无法检索用户之后。我正在使用 Laravel 5.2.14 和 Xampp。我不知道还能写什么,因为它应该是开箱即用的。
这是 php artisan route:list 的输出
+--------+----------+---------------+------+-------------------------------------------------------+----------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+---------------+------+-------------------------------------------------------+----------------+
| | GET|HEAD | / | | Closure | |
| | GET|HEAD | add | | Closure | web,auth.basic |
| | POST | addclub | | App\Http\Controllers\Clubs@addclub | web |
| | POST | auth/login | | App\Http\Controllers\Auth\AuthController@postLogin | web,guest |
| | GET|HEAD | auth/login | | App\Http\Controllers\Auth\AuthController@getLogin | web,guest |
| | GET|HEAD | auth/logout | | App\Http\Controllers\Auth\AuthController@getLogout | web,guest |
| | POST | auth/register | | App\Http\Controllers\Auth\AuthController@postRegister | web,guest |
| | GET|HEAD | auth/register | | App\Http\Controllers\Auth\AuthController@getRegister | web,guest |
| | GET|HEAD | delete/id | | App\Http\Controllers\Clubs@delete | |
| | GET|HEAD | details/id | | App\Http\Controllers\Clubs@details | |
| | GET|HEAD | listofclubs | | App\Http\Controllers\Clubs@listofclubs | |
+--------+----------+---------------+------+-------------------------------------------------------+----------------+
我的配置/sessions.php:
return [
'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => 120,
'expire_on_close' => false,
'encrypt' => false,
'files' => storage_path('framework/sessions'),
'connection' => null,
'table' => 'sessions',
'lottery' => [2, 100],
'cookie' => 'laravel_session',
'path' => '/',
'domain' => null,
'secure' => false,
];
【问题讨论】:
可能是会话持久性问题。你用什么来保存会话? 正如@swatkins 所说,这可能是会话持久性问题。如果您使用的是file
驱动程序,请确保您的storage
文件夹是可写的或尝试database
驱动程序。
“网络”中间件是否应用于所有这些路由?
@Borut 您能否将php artisan route:list
的输出包括在内。需要确保使用 web 中间件组。
我们可以见到你Clubs
控制器和routes.php?
【参考方案1】:
确保你的所有路由都包含在同一个“路由组”和“前缀”中
route::get('/','myController@myAuthMethod'); /* this will not show your user because its an independent route */
route::group(['prefix'=>member,'Middleware'=>yourMiddleware],function()
route::get('a','AuthController@getLogin');
route::get('b','AuthController@getLogout');
route::post('c','AuthController@postRegister');
route::get('d','AuthController@getRegister');
route::get('e','Clubs@delete');
route::get('f','Clubs@details');
route::get('g','Clubs@listofclubs ');
/* a,b,c,d,e,f and g views will show your authenticated user */
);
【讨论】:
【参考方案2】:确保您使用网络中间件注册登录路由:
Route::group(['middleware' => ['web']], function ()
//your routes here
);
【讨论】:
但最近的 laravel 项目应该自动执行此操作,因为 RouteServiceProvider.php 最近发生了变化,并且默认将 Web 中间件添加到所有路由。添加到 php artisan route:list 上面的 cmets 应该会告诉你。 @surgiie Borut 运行的版本不够新 (>= 5.2.28)【参考方案3】:在您的路由上使用“auth”中间件。并且您将能够检索已登录的用户。
【讨论】:
【参考方案4】:正如您的路由列表所述,您的大多数路由都不是网络中间件的一部分。
此中间件负责引导 cookie 和会话。没有它,会话根本不会被读取。
因为身份验证是基于会话的,如果没有找到会话,则检查返回 false。这是一种预期的行为
你必须做的就是将你所有的路线都包含在那个 sn-p 中:
Route::group(['middleware' => ['web']], function ()
//Your routes
如果它不起作用,请您提供您的 routes.php 以及您的应用程序 Http/Kernel.php
【讨论】:
【参考方案5】:我只是尝试重现此内容,但无法:
1。设置 Laravel
已完成的步骤:
-
安装 Laravel 5.2.14
如问题中所述设置数据库并更新配置
运行
php artisan make:auth
运行php artisan migrate
设置虚拟主机,打开应用注册新用户(成功)
注销并再次尝试登录,同样成功。 Auth::check()
也返回正确的值。
2。尝试重现错误
我尝试了以下方法来破坏 Auth 以重现问题:
使/storage/framework/sessions/
不可写
这破坏了应用程序,因为不可写的会话文件夹将导致表单损坏,因为无法设置 CSRF 令牌。
试图更改配置
我更改了sessions.php
配置文件中的各种值。一些更改要么破坏了完整的应用程序,甚至不让我访问登录表单,要么没有影响登录过程。
关于您的应用的其他问题
您尝试登录后/storage/framework/sessions/
中是否有任何文件?
您是否修改了任何 Auth 控制器?
您是否使用了任何可能会干扰身份验证过程的软件包?
调试应用的提示
我无法以任何方式重现您应用的行为。所以可能还有另一个问题也可能与 XAMPP 有关。由于我在 Mac 上,我无法对此进行测试。我建议尝试以下方法:
composer update
更新 Laravel 和所有其他核心依赖项。其中一个依赖项可能存在错误或设置出现问题。
删除身份验证控制器并再次执行php artisan make:auth
在另一个文件夹中再次设置 Laravel 并尝试登录,而不对登录过程或视图进行任何更改。只是基本的设置。这可能表明 XAMPP 是否阻止了 Laravel 正确保存会话所需的任何内容。
使用a debugger 遵循身份验证过程。这可能会向您显示登录过程“失败”的位置。
希望你能找到这个。似乎是一个非常令人沮丧的问题。我也在 Laravel 论坛中进行了搜索,但大多数关于 Auth::check() 失败的专家都没有解决或与配置问题有关。
【讨论】:
在 /storage/framework/sessions/ 中创建了一些文件。我没有修改任何 Auth 控制器。我不知道我是否使用了任何可能会干扰身份验证过程的软件包。【参考方案6】:我遇到了类似的问题,这让我发疯了好几天。这是一个不需要身份验证的示例项目,但我还是想制作它,因为它很容易,然后它就不起作用了。使用具有正确权限的文件存储或数据库存储没有任何区别。我也在玩会话配置选项,但也没有任何帮助。
我的所有路由都用web
和auth
中间件封装到一个组中。然而,直到我将 EncryptCookies
、AddQueuedCookiesToResponse
和 StartSession
中间件从 web
($middlewareGroups
) 移动到 app/Http/Kernel.php
中的 $middleware
之前,事情并没有奏效。所以,最后,这就是它的样子:
protected $middleware = [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
],
'api' => [
'throttle:60,1',
],
];
我懒得去查原因,就这样吧。 Laravel 版本是 v5.2.31。
【讨论】:
以上是关于Laravel身份验证,我无法检索登录用户的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 身份验证在 laravel 5.3 中无法正常工作
获取经过身份验证的用户 Laravel/Lumen Passport
Laravel 仅在模型记录属于经过身份验证的用户时才检索它们