我已针对此问题进行了google搜索和stackoverflowed(如果可能),并且无法找到足够的答案:(某些参考:Laravel 4: when using Config::set to change auth.model then Auth::user() not work,Laravel 5.2 how to use config::set in middleware)
如何在Laravel 5.2中使用Config::set()
在运行时成功设置变量两次。*?
这是我试图实现的一个例子:
我有两个表companies
和users
(他们都使用JWTAuth从不同的路由登录)。现在,我想在此单一路线computers
Route::get('/computers')
条记录
现在的问题是我想使用相同的中间件来做到这一点,但我想确保这些用户(即公司或用户)之前的任何用户都经过身份验证可以访问此资源
以下是我尝试在中间件中使用Config::set()
的内容:
//all.auth middleware
public function handle($request, Closure $next)
{
Config::set('auth.providers.users.model', \App\Company::class);
Config::set('jwt.user', \App\Company::class);
//check if the request is for company
if($company = JWTAuth::toUser(($request->has('token')) ? $request->token : $request->bearerToken()))
{
return ['COMPANY' => $company];
}
//Unfortunately its not company, lets try users
Config::set('auth.providers.users.model', \App\User::class);
Config::set('jwt.user', \App\User::class);
if($user = JWTAuth::toUser(($request->has('token')) ? $request->token : $request->bearerToken()))
{
return ['USER' => $user];
}
throw new NotFoundHttpException('Your account could not be found.');
...............
}
现在,我注意到的行为是它成功地将JWT使用的模型更改为Company
,但是如果随请求发送的令牌是User
,则不会将其更改为User
1}}。
如果有人可以提供帮助,至少了解这是否可行,我将不胜感激。
如果需要提供更多解释,我准备这样做。
答案 0 :(得分:1)
多次设置配置值按预期工作。您的代码无法按预期工作的原因是 JWTAuth 外观背后的服务仅在您第一次使用这两个配置参数的当前值进行访问时才解析一次。以后更改它不会产生任何影响。
为了实现您的目标,您需要使Laravel的服务容器使用新的配置值重新创建服务。要做到这一点,你需要做两件事。
首先,从Facade中删除已解析的实例,以便下次使用时,它从服务容器中获取新的服务实例:
JWTAuth::clearResolvedInstances();
然后从容器中删除服务实例,以便需要使用新的配置值再次创建它:
App::forgetInstance('tymon.jwt.auth');
设置新配置值后添加这2行,下次使用 JWTAuth 外观时,应使用新设置。
答案 1 :(得分:1)
对于您在代码中第二次调用JWTAuth Facade时我能理解的内容,它自己的实例已经存在于服务容器中。
JWTAuth不必另外构造或初始化,因此它使用在您第一次调用时使用配置构建的旧实例。
Config :: set()两次工作,但JWTAuth实例总是相同(第一个),所以我认为你必须在第二次调用Facade之前销毁JWTAuth实例。
希望这会有所帮助。
答案 2 :(得分:1)
正如@jedrzej.kurylo指出在启动JWTAuth Facade之前多次设置配置值,但是JWTAuth Facade只解析了一次。因此,您必须强制外观被遗忘并重新解析才能获得配置更改。
jedrzej中提出的代码在Laravel 5.5中对我没有用,看起来门面没有被遗忘。
通过忘记app()->getBindings()
中列出的其他实例来消除过程,我可以使用以下内容重置外观。
JWTAuth::clearResolvedInstances();
app()->forgetInstance('tymon.jwt.auth');
app()->forgetInstance('tymon.jwt.provider.user');
希望如果其他人在挣扎,这会有所帮助。