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_driver
从 file
更改为 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 几秒钟后自动注销?的主要内容,如果未能解决你的问题,请参考以下文章