14

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#retrifying-the-authenticated-user

したがって、次を使用してユーザーを取得できます。

$request->user();

Spark は明らかにこのメソッドを使用して、ユーザーのサブスクリプションが有効かどうかを確認します (laravel\spark\src\Http\Middleware\VerifyUserIsSubscribe):

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

私のミドルウェアでは、次を使用してユーザーを取得できますが$request->user;、laravelのデフォルトでは取得できないため、機能していません$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);
            });
        });
    }

このコードを適切な修正を加えてミドルウェアに挿入しようとしましたが、それを機能させる方法がわかりません。

4

4 に答える 4

40

これを試すための 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() もルート クロージャーにあり、そこにあります。

アプリの再バインドは私には少し奇妙で、必要ではないように思えました。あなたがしていることにこれが本当に必要かどうかはわかりません。

于 2016-09-12T06:34:44.487 に答える
3

authそのモデルが適切なインターフェースを実装している場合、システムを使用して、リクエストのためにログインすることができます。

Auth は rebinder を使用して on を割り当てuserResolverますrequest。(だからあなた$request->user()はそれから得ます)。Illuminate\Auth\AuthServiceProvider@registerRequestRebindHandlerそのリゾルバーの設定方法を確認してください。

$request->setUserResolver(....)
于 2016-09-09T21:48:01.687 に答える