我正在使用Laravel 5开发Web应用程序,使用RESTFUL apis开发angularJs。
使用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");
}
}
几个请求消失后,Server注销并发送401异常。我坚持这个问题。
答案 0 :(得分:14)
现在我不是百分百肯定(根据您的设置,我甚至可以说我90%肯定)但是从{{更改session_driver
之后1}}到file
我似乎解决了这个问题 - 即如果它是同一个问题。
我认为和我的应用程序做同样的事情 - 这是在一个页面的启动时,我做了6个请求(这是开发我会将其更改为一个所以请不要哭)。如果我加载此页面,它可以使用大约3或4个请求,然后其他2-3个回复database
响应。它也只在需要unauthorised
的请求时发生。
以下是我的理论为何会发生这种情况:因为默认情况下,会话会保存在文件中 - 一次发出多个请求意味着文件一次打开6次 - 可能搞乱了(取决于你的机器)。因此,将会话更改为数据库(一次有数千个请求),可以正常工作!
解决方案:
middleware => auth
文件,将.env
更改为SESSION_DRIVER=file
。 SESSION_DRIVER=database
。 php artisan session:table
进行良好练习。composer dump-autoload
)。注意:我不是100%肯定,但如果是这样,但对我来说这个解决方案有效。我也知道这个问题真的很老了,但我和我一起工作的开发人员都遇到过这个问题而且似乎并不是一个解决方案,所以尽管我发布了这个问题。
答案 1 :(得分:2)
您可能是非法访问用户变量的问题。请在访问Auth::check()
之前使用Auth::user()
这似乎适用于我的项目。 (可选)您可以尝试从.env文件更改会话驱动程序。
答案 2 :(得分:1)
管理好弄清楚..因为我几乎所有项目都使用laravel,我忘了更改会话名称,因此,一个会话覆盖了另一个会话,导致自动登录..所以如果你运行多个laravel项目,确保它们都有不同的会话名称。希望这有助于将来的某些人! Here is a Laracast thread on this issue.
对我而言,这是解决问题的过程:
cookie
中app/session.php
键的值。php artisan config:clear
。 答案 3 :(得分:0)
可能对某人有用:有同样的问题。我在会话设置中更改了cookie名称。默认情况下,它是laravel_session,因此请尝试将其设置为其他内容
答案 4 :(得分:0)
我通过使用php artisan cache:clear清除缓存并运行composer dump-autoload解决了相同的问题。希望这对您有用。
答案 5 :(得分: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
下。
我希望这可以帮助可能遇到同样问题的人。
答案 6 :(得分:0)
我认为您已将旧项目复制到新应用程序中,因此您需要更改config/session.php
'cookie' => 'new_session',
答案 7 :(得分:0)
我有一个类似的问题,用户根本没有登录,我发现它是因为我的可验证的雄辩模型,在 config/auth.php
中的我的 auth guard 中指定(用户在我的案例)。
我正在应用全局范围(在我的情况下已验证),以便用户被特定列过滤,而身份验证守卫找不到用户,因此每次都注销...
我通过这篇文章解决了我的问题https://laracasts.com/discuss/channels/laravel/ignore-global-scopes-for-auth