Laravel在x次请求后将用户注销

时间:2017-05-17 15:24:27

标签: php laravel laravel-5

应用程序已按预期运行,直到我添加以下路径显示图像:

Route::get('/images/workers/{imageName}', function($imageName){
    if(Auth::check()){

        // Intervention using GD does not have functionality for bmp images
        //return \Image::make(getenv('IMAGE_DIR') . $imageName)->response();

        $filename = getenv('IMAGE_DIR') . $imageName;
        $handle = fopen($filename, "rb");
        $contents = fread($handle, filesize($filename));
        fclose($handle);

        header("content-type: image/bmp");

        echo $contents;

    } else {
        return \Image::make(getenv('IMAGE_DIR') . 'denied.png')->response();
    }
});

在我的一个控制器中,我获取包含这些图像链接的记录,并将它们显示在带分页的表格中。我一次用<img>个元素显示50条记录,以显示图像(这些是记录的缩略图)。我通常可以按预期显示前几页,但之后我会开始显示我的denied.png图像,一旦发生这种情况,我发现我已经注销并且必须重新登录。

我阅读Andrew's answer here并得出结论,我发生了竞争条件,这种情况以某种方式破坏了会话并导致帐户被注销。然后我在我的数据库中创建了一个sessions表,并将laravel中的会话驱动程序更改为database,但是它看起来不像使用会话驱动程序?那是对的吗?如果是这样,这是一种竞争条件,我怎么能绕过它呢?

使用laravel 5.2.45

修改

其他可能值得注意的是,这个环境正在使用nginx / phpfpm。可能是我的大多数请求都是由一个工作线程处理的,但偶尔会被另一个工作线程处理,而这个线程不知道现有的身份验证会话?或者,无论哪个工作线程通过fpm处理请求并且认证会话都在它们之间持续存在并不重要?

1 个答案:

答案 0 :(得分:0)

看来,这个特定的路由包裹着Web中间件处理了这个问题:

Route::group(['middleware' => ['web']], function () {

    Route::get('/images/workers/{imageName}', function($imageName){
        if(Auth::check()){

            // Intervention using GD does not have functionality for bmp images
            //return \Image::make(getenv('IMAGE_DIR') . $imageName)->response();

            $filename = getenv('IMAGE_DIR') . $imageName;
            $handle = fopen($filename, "rb");
            $contents = fread($handle, filesize($filename));
            fclose($handle);

            header("content-type: image/bmp");

            echo $contents;

        } else {
            return \Image::make(getenv('IMAGE_DIR') . 'denied.png')->response();
        }
    });

});