几秒钟后,Laravel自动退出登录?

9

我正在使用Laravel 5和AngularJs开发Web应用程序,并使用RESTful API进行开发。

使用中间件进行身份验证。我的问题是在同时发送几个请求后,系统会自动退出并从Laravel端发送401异常。

API基础控制器:

class ApiController extends BaseController {

    use DispatchesCommands, ValidatesRequests;

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

}

Middleware:

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,一切都正常工作了。 - ako
8个回答

25

我不能完全确定(根据您的设置,我甚至无法说我有90%的把握),但是在将我的session_driverfile更改为database后,似乎已经解决了这个问题-如果它是同一个问题的话。

我认为我的应用和您做的一样-即在页面启动时,我会发出6个请求(这是开发,我将将其更改为一个,所以请不要哭)。 如果我加载此页面,则大约有3或4个请求可以工作,然后另外2-3个会返回unauthorised响应。 它也只会发生在需要middleware => auth的请求上。

因此,这是我的理论: 因为默认情况下,sessions被保存在一个file中-同时进行多个请求意味着该file被同时打开6次-可能会弄乱它(取决于您的机器)。 因此,将会话更改为设计用于同时处理数千个请求的数据库会起作用!

解决方法:

  1. 转到您的.env文件并将SESSION_DRIVER=file更改为SESSION_DRIVER=database
  2. 接下来,您需要创建一个会话迁移:php artisan session:table
  3. 现在进行composer dump-autoload以获得良好的实践经验。
  4. 最后迁移(php artisan migrate)。

注意: 我不能完全确定是否是这种情况,但对我而言,这个解决方案有效。 我也知道这个问题真的很旧,但我和我一起工作的开发人员都遇到了这个问题,并且似乎没有解决方案,所以我想发布这篇文章。


谢谢您的评论。当我将会话从文件更改为数据库时,它现在可以正常工作了。 - gsk

5
我成功找到了解决方法。由于我在几乎所有项目中都使用laravel,因此我忘记更改会话名称,结果一个会话覆盖了另一个会话,导致自动注销。因此,如果您有多个正在运行的 Laravel 项目,请确保它们都具有不同的会话名称。希望这可以帮助未来的某些人!这是一个关于此问题的 Laracast 主题。 对我来说,以下是解决问题的过程:
  1. 清除本地主机的浏览器 cookie。
  2. 更改 app/session.php 中的 cookie 键的值。
  3. 运行 php artisan config:clear

4

您可能正在非法访问用户变量,建议在访问 Auth::user() 之前使用 Auth::check() 进行检查。这对我的项目有用。如果需要的话,您还可以尝试从 .env 文件更改会话驱动程序。


1
我觉得你是对的。我不确定是什么原因导致了这个问题,但当我在使用“用户”实例时进行代码更改后,问题得到了解决。也许当我尝试访问“用户”时它是“null”或者类似的情况。 - ako

0

这个星期我遇到类似的问题。我有一个服务器,上面有多个 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的路径下。

希望这能帮助到可能遇到同样问题的人。


0

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


0

我曾经遇到过类似的问题,用户根本无法登录,后来我发现这是因为我的可认证 Eloquent 模型在 config/auth.php(在我的情况下是 User)中被指定了。

我应用了一个全局作用域(在我的情况下是 verified),以便用户可以通过特定列进行筛选,但是认证守卫找不到用户,所以每次都会注销...

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


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

0

我认为你复制了一个旧项目用于新应用,因此你需要更改 config/session.php 文件

'cookie' => 'new_session',

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