我正在用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\VerifyUserIsSubscribed):

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

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

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

提前谢谢

EDIT:

服务Provider 中的Laravel(照亮\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);
            });
        });
    }

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

推荐答案

我没有Spark的副本来try 这个&;确保我所做的对你来说是正确的,但我认为这会有所帮助:

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);

I also $request->user() in the route closure, and it is there.

应用程序重新绑定对我来说有点奇怪,似乎没有必要.我不确定你所做的事情是否真的需要这个.

Laravel相关问答推荐

@vite指令在使用laravel vite构建后导致错误

Laravel:BelongstoMany 关系实现

使用 App::environment() 与 app()->environment() 与 config('app.env') 之间的区别

RuntimeException 未安装 Zip PHP 扩展

如何使用 Laravel Passport 在 API 中正确实现 OAuth?

Laravel 5.1 - 如何在进度条上设置消息

Laravel 保存一对多关系

上传时Laravel正在旋转图像

Laravel:如何通过 id 从集合中删除项目

如何在 Laravel 5.5 中扩展 vendor 包服务提供者

Laravel 5.1 重命名项目

使用 laravel eloquent 关系检索除 NULL 之外的所有记录

如何处理 laravel 5 中的私有图像?

Cookie::forget 不工作 laravel 5.1

在 Laravel 5 中找不到类App\Http\Controllers\Artisan

安装后在 Lumen 中找不到页面

Laravel 中的单会话登录

Laravel 接口

Laravel 检测手机/平板电脑并加载正确的视图

登录后 DevTools 无法解析 SourceMap 错误将重定向到该 js 文件