无法使用自己的实现覆盖Laravel Spark身份验证

时间:2017-08-18 09:56:58

标签: php laravel laravel-5 laravel-spark

在Laravel Spark的登录过程中,我需要请求远程API的令牌。此API存储与Laravel Spark应用程序完全相同的用户和密码。因此,我需要在身份验证过程中获取用户的用户名和非哈希密码。

我认为重写经过身份验证的方法可以解决我的问题。在routes / web.php中,我覆盖了POST /login端点,并将此端点指向我自己的LoginController:

<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
use Laravel\Spark\Http\Controllers\Auth\LoginController as SparkLoginController;

class LoginController extends SparkLoginController
{
    /**
     * Create a new login controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Handle a successful authentication attempt.
     *
     * @param  Request  $request
     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
     * @return Response
     */
    public function authenticated(Request $request, $user)
    {
        Log::info('authenticated method in LoginController has been called');

        return parent::authenticated($request, $user);
    }
}

此实现会引发Missing argument 2 for App\Http\Controllers\Auth\LoginController::authenticated()异常。不知何故,Laravel没有在$ user参数中传递User。无论我做什么,都会抛出此异常。即使从我的LoginController中删除该方法也会导致Spark LoginController中抛出相同的异常。

当我禁用我的/login端点并在Spark LoginController中记录经过身份验证的方法的$ request和$ user参数时,我看到$ request包含Illuminate\Http\Request::__set_state(array(...))而$ user包含{{1} }。当我在我自己的控制器中记录相同时,$ request包含App\User::__set_state(array())并且$ user未通过。

1 个答案:

答案 0 :(得分:2)

事实证明我的POST /login路线没有调用正确的功能。它调用了Auth\LoginController@authenticated,它应该调用Auth\LoginController@login

完整路线的外观如何:Route::post('/login', 'Auth\LoginController@login');

愚蠢的错误,但也许它会帮助将来面临同样问题的人。