Как привязать объект пользователя к запросу в промежуточном программном обеспечении

Я пишу приложение в 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 по умолчанию пользовательский объект внедряется в запрос (см. Документацию laravel): https://laravel.com/docs/5.2/authentication#retrieving-the-authenticated-user

Таким образом, вы можете получить пользователя, используя:

$request->user();

Очевидно, Spark использует этот метод для проверки правильности подписки пользователя (laravel \ spark \ src \ Http \ Middleware \ VerifyUserIsSubscribeed):

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

И это не работает, потому что с моим промежуточным ПО вы можете получить пользователя, используя: $request->user; но не с настройками по умолчанию $request->user();

Как я должен ввести пользовательский объект в запрос?

заранее спасибо

РЕДАКТИРОВАТЬ:

Laravel в сервис-провайдере (Illuminate \ Auth \ AuthServiceProvider @ registerRequestRebindHandler)

Используйте этот код, чтобы привязать пользователя объекта к запросу:

/**
* 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);
});
});
}

Я попытался вставить этот код с соответствующим исправлением в промежуточное ПО, но не могу понять, как заставить его работать.

2

Решение

У меня нет копии Spark, чтобы попробовать это & убедитесь, что то, что я делаю, правильно для вас, но я думаю, что это поможет:

1) Предположение — я полагаю, вы говорите, что да, эта строка даст вам пользователя, которого вы хотите:

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

и вы просто хотите связать его с запросом, чтобы вы могли получить доступ к этому пользователю позже в вашем приложении через:

$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 () в закрытии маршрута, и это там.

Повторная привязка приложения была немного странной для меня и не казалась необходимой. Я не уверен, что что-то действительно нужно для того, что вы делаете.

15

Другие решения

Вы могли бы использовать auth Система, если эта модель реализует правильный интерфейс, чтобы войти в них для запроса.

Auth использует ребиндер для назначения userResolver на request, (Так вы получаете $request->user() от него). Проверьте Illuminate\Auth\AuthServiceProvider@registerRequestRebindHandler чтобы увидеть, как его настройки, что решатель.

$request->setUserResolver(....)
2

Это очень полезный вопрос. У меня были проблемы с выбранным решением, хотя. В моем промежуточном программном обеспечении я мог успешно видеть $ request-> user (), однако он не работал при использовании gates, а именно в классе Access / Gate:

protected function raw($ability, $arguments = [])
{
if (! $user = $this->resolveUser()) {
return false;
}

// ...

Эта функция всегда возвращает false: /

Так что я сделал это как предложено здесь (http://laravel-recipes.com/recipes/230/setting-the-currently-authenticated-user), а именно:

$usr = new User();
$usr->setAttribute('id', $request->user_id);
Auth::setUser($usr);

И, похоже, работает без использования setUserResolver ().

Спасибо

1
По вопросам рекламы [email protected]