Laravel身份验证,无法检索已登录用户

3
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                |                |
+--------+----------+---------------+------+-------------------------------------------------------+----------------+

我的config/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
2
“web” 中间件应用于所有这些路由吗? - lagbox
可能与会话持久性有关。我不知道我在使用什么。我没有更改或配置任何内容。我会检查一下。 - Borut Flis
你正在访问哪些路由,导致 Auth::check "不起作用"?但是无论如何,你在其中4个路由上缺少了 'web' 中间件。 - lagbox
1
我们能看到你的 Clubs 控制器和 routes.php 吗? - huuuk
显示剩余5条评论
6个回答

3
确保所有路由都包含在同一个“路由组”和“前缀”中。
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

确保您使用web中间件注册登录路由:

Route::group(['middleware' => ['web']], function () {
    //your routes here
});

但是最近的 Laravel 项目应该会自动执行此操作,因为 RouteServiceProvider.php 最近已更改,并默认将 web 中间件添加到所有路由中。在上面的注释中添加 php artisan route:list 应该会告诉你。 - surgiie
1
@surgiie,Borut没有运行足够新的版本(>= 5.2.28)。 - tanerkay

1
在你的路由上使用'auth'中间件。这样你就可以检索已登录的用户。

1
根据您的路由列表,大多数路由都不是Web中间件的一部分。
该中间件负责引导cookie和会话。如果没有它,会话根本无法读取。
因为auth基于会话,如果找不到会话,则检查返回false。这是一种预期行为。
您需要做的是将所有路由包含在此片段中:
Route::group(['middleware' => ['web']], function () {
    //Your routes
}

如果它不能正常工作,您能否提供您的routes.php以及应用程序Http/Kernel.php文件?

0

我刚试图重现这个问题,但没有成功:

1. 设置 Laravel

完成的步骤:

  1. 安装 Laravel 5.2.14
  2. 设置数据库并按照问题中提到的更新配置
  3. 运行 php artisan make:auth
  4. 运行 php artisan migrate
  5. 设置虚拟主机,打开应用程序并注册一个新用户(成功)
  6. 注销并尝试再次登录,也成功了。 Auth::check() 也返回了正确的值。

2. 尝试重现错误

我尝试了以下方法来破坏 Auth 以重现问题:

  • 使 /storage/framework/sessions/ 不可写
    这会破坏应用程序,因为不可写的会话文件夹将导致表单损坏,因为无法设置 CSRF 令牌。
  • 尝试更改配置
    我在 sessions.php 配置文件中更改了各种值。有些更改会破坏整个应用程序,甚至不让我访问登录表单,而有些则不会影响登录过程。

关于您的应用程序的其他问题

  • 在尝试登录后,/storage/framework/sessions/ 中是否有任何文件?
  • 您是否修改了任何 Auth 控制器?
  • 您是否使用了可能会干扰认证过程的任何软件包?

调试应用程序的提示

我无法以任何方式重现您的应用程序的行为。因此,可能还存在与 XAMPP 相关的其他问题。由于我使用的是 Mac,因此无法进行测试。我建议尝试以下内容:

  • 运行 composer update 命令来更新 Laravel 和所有其他核心依赖项。可能是其中一个依赖项中存在错误或者设置出了问题。
  • 删除 Auth 控制器,然后再次运行 php artisan make:auth
  • 在另一个文件夹中重新设置 Laravel,并尝试登录而不对登录过程或视图进行任何更改。只需进行基本设置即可。这可以显示 XAMPP 是否阻止 Laravel 需要正确保存会话的任何内容。
  • 使用 a debugger 来跟踪认证过程。这可以显示您登录过程“失败”的位置。

希望您能找到解决方法。这似乎是一个非常令人沮丧的问题。我还在 Laravel 论坛中搜索过,但大多数关于 Auth::check() 失败的帖子都没有解决或与配置问题有关。


有一些文件被创建在/storage/framework/sessions/目录下。我没有修改任何Auth控制器。我不知道是否使用了可能会干扰认证过程的任何软件包。 - Borut Flis

0

我曾经遇到类似的问题,困扰了我数天。这是一个不需要验证的样例项目,但我想试着加上验证,因为这很容易,然而却一直无效。使用正确权限的文件存储或数据库存储都没有作用。我还在尝试会话配置选项,但也没有任何帮助。

我所有的路由都被包装在一个同时具有webauth中间件的组中。然而,除非我将EncryptCookiesAddQueuedCookiesToResponseStartSession中间件从web($middlewareGroups)移到$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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接