无法使用自己的实现覆盖 Laravel Spark 身份验证
Cannot override Laravel Spark authentication with own implementation
在 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 参数中传递用户。无论我做什么,都会抛出这个异常。即使从我的 LoginController 中删除该方法也会导致在 Spark LoginController 中抛出相同的异常。
当我禁用我的 /login
端点并在 Spark LoginController 中记录经过身份验证的方法的 $request 和 $user 参数时,我看到 $request 包含 Illuminate\Http\Request::__set_state(array(...))
并且 $user 包含 App\User::__set_state(array())
。当我在自己的控制器中记录相同内容时,$request 包含 Illuminate\Http\Request::__set_state(array(...))
并且未传递 $user。
原来是我的POST/login
路由没有调用正确的函数。它调用了 Auth\LoginController@authenticated
,它应该调用 Auth\LoginController@login
。
完整路线的外观:Route::post('/login', 'Auth\LoginController@login');
愚蠢的错误,但也许它会帮助将来遇到同样问题的人。
在 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 参数中传递用户。无论我做什么,都会抛出这个异常。即使从我的 LoginController 中删除该方法也会导致在 Spark LoginController 中抛出相同的异常。
当我禁用我的 /login
端点并在 Spark LoginController 中记录经过身份验证的方法的 $request 和 $user 参数时,我看到 $request 包含 Illuminate\Http\Request::__set_state(array(...))
并且 $user 包含 App\User::__set_state(array())
。当我在自己的控制器中记录相同内容时,$request 包含 Illuminate\Http\Request::__set_state(array(...))
并且未传递 $user。
原来是我的POST/login
路由没有调用正确的函数。它调用了 Auth\LoginController@authenticated
,它应该调用 Auth\LoginController@login
。
完整路线的外观:Route::post('/login', 'Auth\LoginController@login');
愚蠢的错误,但也许它会帮助将来遇到同样问题的人。