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】:

我遇到了类似的问题,这让我发疯了好几天。这是一个不需要身份验证的示例项目,但我还是想制作它,因为它很容易,然后它就不起作用了。使用具有正确权限的文件存储或数据库存储没有任何区别。我也在玩会话配置选项,但也没有任何帮助。

我的所有路由都用webauth 中间件封装到一个组中。然而,直到我将 EncryptCookiesAddQueuedCookiesToResponseStartSession 中间件从 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 5.5 无法使用身份验证脚手架登录

Laravel 身份验证在 laravel 5.3 中无法正常工作

获取经过身份验证的用户 Laravel/Lumen Passport

Laravel 仅在模型记录属于经过身份验证的用户时才检索它们

如何在 Vue JS 中使用 Laravel 进行身份验证,以便用户在没有登录的情况下无法从 URL 进入他的页面

Laravel 默认登录身份验证生成意外错误