Laravel 几秒钟后自动注销?

Posted

技术标签:

【中文标题】Laravel 几秒钟后自动注销?【英文标题】:Laravel automatically logged out after few seconds? 【发布时间】:2015-06-03 17:24:44 【问题描述】:

我正在使用 Laravel 5 和带有 RESTFUL apis 的 angularJs 开发 Web 应用程序。

使用middleware 进行身份验证。我的问题是同时发送几个请求后,系统自动注销并从 laravel 端发送 401 异常。

API 基础控制器:

class ApiController extends BaseController 

    use DispatchesCommands, ValidatesRequests;

    function __construct() 
        $this->middleware('api.auth');
    


中间件:

class APIMiddleware 

    /**
     * Handle an incoming request.
     *
     * @param  Request  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next) 
        if (!Auth::check()) 
            abort(401, "Unauthorized");
        
        return $next($request);
    


登录控制器

public function login(LoginRequest $request) 
    if (Auth::check()) 
        Auth::logout();
    

    if (Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password')], $request->input('is_remember'))) 
        return array(true);
     else 
        abort(401, "Invalid email & password");
    

在几个请求消失后,服务器注销并发送 401 异常。我被这个问题困住了。

【问题讨论】:

对我来说这个错误是因为在 php.ini 文件中将 always_populate_raw_post_data = -1 更改为 always_populate_raw_post_data = 1 ......最后我改变了它到 always_populate_raw_post_data = 0 一切正常 【参考方案1】:

现在我不是 100% 确定(根据您的设置,我什至不能说我 90% 确定)但是在将我的 session_driverfile 更改为 database 之后,我似乎已经解决了这个问题 - 也就是说,如果它是同一个问题。

我想对我的应用做同样的事情 - 在页面启动时,我提出 6 个请求(这是开发,我会将其更改为 一个所以请不要哭)。如果我加载此页面,它可以处理大约 3 或 4 个请求,然后其他 2-3 个返回 unauthorised 响应。它也只在需要middleware => auth 的请求时发生。

所以这是我对为什么会发生这种情况的理论:因为默认情况下,会话保存在 文件中 - 在一次意味着 file 一次被打开 6 次 - 可能会搞砸(取决于您的机器)。因此,将会话更改为旨在同时处理数千个请求的数据库是可行的!

解决方案:

    转到您的.env 文件并将SESSION_DRIVER=file 更改为SESSION_DRIVER=database。 接下来您需要创建一个会话迁移:php artisan session:table。 现在composer dump-autoload 进行良好实践。 终于迁移 (php artisan migrate)。

注意:我不能 100% 确定是否是这种情况,但对我来说,这个解决方案有效。我也知道这个问题真的很老了,但是我和我一起工作的开发人员都遇到了这个问题,而且似乎没有解决方案,所以尽管我会发布这个。

【讨论】:

感谢您的评论。当我将会话从文件更改为数据库时。它现在工作正常..【参考方案2】:

这可能是您非法访问用户变量的问题。请在访问Auth::user() 之前使用Auth::check() 这似乎适用于我的项目。或者,您可以尝试从 .env 文件更改会话驱动程序。

【讨论】:

我认为你是对的。我不知道究竟是什么原因造成的,但我在使用user 实例时对代码进行了更改,它解决了。也许我正试图访问user,当时它是null 或类似的东西。【参考方案3】:

可能对某人有用:遇到同样的问题。我在会话设置中更改了 cookie 名称。默认情况下是 laravel_session,所以尝试将其设置为其他内容

【讨论】:

【参考方案4】:

设法弄清楚了.. 由于我几乎所有项目都使用 laravel,我忘记更改会话名称,结果,一个会话覆盖了另一个会话,导致自动注销.. 所以如果你运行多个 laravel 项目,确保它们都有不同的会话名称。希望这对将来的人有所帮助! Here is a Laracast thread on this issue.

对我来说,这是解决问题的过程:

    已清除浏览器的 localhost cookie。 在app/session.php 中更改了cookie 键的值。 跑php artisan config:clear

【讨论】:

【参考方案5】:

我通过使用 php artisan cache:clear 清除缓存并运行 composer dump-autoload 解决了同样的问题。希望这对你有用。

【讨论】:

【参考方案6】:

这周我遇到了类似的问题。我有一个带有多个 Laravel 应用程序的服务器。一个应用程序正在注销另一个应用程序。

问题与会话管理有关。所有应用程序的会话名称都相同。改变它就足以避免不同的应用程序冲突。但是,我可以在服务器中拥有同一应用程序的不同实例(例如,出于测试目的)。因此,仅更改会话名称是不够的。

为了正确解决我的问题,我使用会话路径使每个实例的配置唯一。在config/session.php 中,我定义了这样的内容:

'cookie' => 'systemx_session',
'path' => parse_url(env('APP_URL', 'http://localhost'), PHP_URL_PATH),

我将parse_url 函数与环境变量APP_URL 一起使用,因为我的服务器将实例部署在http://example.com/systemx 之类的东西下。

我希望这对可能最终遇到同样问题的人有所帮助。

【讨论】:

【参考方案7】:

我认为您为新应用程序复制了一个旧项目,因此您需要更改config/session.php

'cookie' => 'new_session',

【讨论】:

【参考方案8】:

我有一个类似的问题,用户根本没有登录,我发现它是因为我的可验证的 eloquent 模型,在 config/auth.php 的身份验证守卫中指定(在我的情况下是用户) .

我正在应用一个全局范围(在我的情况下已验证),以便用户被特定列过滤& auth guard 找不到用户所以它每次都注销...

我通过这篇帖子https://laracasts.com/discuss/channels/laravel/ignore-global-scopes-for-auth解决了我的问题

【讨论】:

以上是关于Laravel 几秒钟后自动注销?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.1 auth 刷新后注销

使用 Angularjs 和 Laravel 注销会话过期

会话 Cookie,自动注销

在 YII2 中使用自动注销,需要在再次登录后将用户重定向到用户在自动注销之前的相同 URL

Laravel 间歇性注销

黑苹果待机后自动注销登陆