gpt4 book ai didi

php - 如何将用户对象绑定(bind)到中间件中的请求

转载 作者:可可西里 更新时间:2023-10-31 23:52:35 24 4
gpt4 key购买 nike

我正在 Laravel Spark 1.0 (Laravel 5.2) 中编写应用程序。我为代理 (api) 身份验证编写了一个自定义中间件。这是代码:

<?php

namespace App\Http\Middleware;

use App\Agent;
use Closure;
use Illuminate\Http\Request;

class AgentAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if( isset($request->token) && !empty($request->token) )
{
$agent = Agent::where('token', '=', $request->token)->first();

if( $agent != NULL )
{
$team = $agent->Team()->first();
$user = $team->User()->first();

$request->merge(['team' => $team ]);
$request->merge(['user' => $user ]);

return $next($request);
}
else {
return response('Unauthorized 2.', 401);
}

}
else {
return response('Unauthorized 1.', 401);
}
}
}

在默认的 laravel 身份验证中,用户对象被注入(inject)到请求中(参见 laravel 文档):https://laravel.com/docs/5.2/authentication#retrieving-the-authenticated-user

因此您可以使用以下方法检索用户:

$request->user();

Spark 显然使用这个方法来检查用户订阅是否有效(laravel\spark\src\Http\Middleware\VerifyUserIsSubscribed):

if ($this->subscribed($request->user(), $subscription, $plan, func_num_args() === 2)) {
return $next($request);
}

它不起作用,因为使用我的中间件,您可以使用以下方法检索用户:$request->user; 但不能使用 laravel 默认值 $request->user();

我应该如何将用户对象注入(inject)到请求中?

提前致谢

编辑:

Laravel 中的服务提供者(Illuminate\Auth\AuthServiceProvider@registerRequestRebindHandler)

使用此代码将对象用户绑定(bind)到请求:

/**
* Register a resolver for the authenticated user.
*
* @return void
*/
protected function registerRequestRebindHandler()
{
$this->app->rebinding('request', function ($app, $request) {
$request->setUserResolver(function ($guard = null) use ($app) {
return call_user_func($app['auth']->userResolver(), $guard);
});
});
}

我试图在中间件中插入这段代码,并进行适当的更正,但我不知道如何让它工作。

最佳答案

我没有 Spark 的副本来尝试这个并确保我正在做的对你来说是正确的,但我认为这会有所帮助:

1) 一个假设 - 我相信你是说是的,这一行会让你得到你想要的用户:

$user = $team->User()->first();

并且您只想将其绑定(bind)到请求,以便您稍后可以通过以下方式在您的应用中访问该用户:

$request->user()

2) 如果这是真的,那么我所做的就是简化您提供的要添加的代码:

$request->merge(['user' => $user ]);

//add this
$request->setUserResolver(function () use ($user) {
return $user;
});

// if you dump() you can now see the $request has it
dump($request->user());

return $next($request);

我也在路由闭包中 $request->user() ,它就在那里。

应用程序重新绑定(bind)对我来说有点奇怪,而且似乎没有必要。我不确定您正在做的事情是否真的需要这个。

关于php - 如何将用户对象绑定(bind)到中间件中的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39414776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com