如何在 Laravel 中编辑 dingo/api 身份验证中间件?
How can I edit dingo/api auth middleware in Laravel?
在一个完整的 restful Laravel 项目中,我使用的是 dingo/api
包。在处理任何请求之前,我需要设置一些与当前用户相关的配置和其他内容。我们在使用dingo的时候,可以这样访问当前用户:
$user = app('Dingo\Api\Auth\Auth')->user();
首先我认为我应该在服务提供商中执行此操作。但是那里的 Laravel 还没有启动 dingo 验证,因此它给我一个错误。然后我想我需要编辑名为 api.auth
的 dingo auth 中间件来执行此操作。它在我的路线上的用法是这样的:
<?php
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', ['prefix' => 'v1', 'namespace' => 'App\Http\Controllers'], function ($api) {
$api->group(['prefix' => 'admin', 'middleware' => 'api.auth'], function ($api) {
$api->get('checkRole/{branch_id}', 'RoleController@getRoles');
但我无权访问它,因为它是 dingo 包中的内置中间件。那么遇到这种情况该怎么办呢?
我自己解决了这个问题,但我忘了在这里回答。
我只是扩展了 digo auth 中间件并覆盖了它的 handle
方法。但是我不得不通过项目中的所有路由文件替换中间件名称(我正在使用 nwidart/laravel-modules
包来编写模块化项目)。
<?php
namespace App\Http\Middleware;
use Closure;
use Dingo\Api\Http\Middleware\Auth;
class ApiAuth extends Auth
{
public function handle($request, Closure $next)
{
$route = $this->router->getCurrentRoute();
if (!$this->auth->check(false))
$this->auth->authenticate($route->getAuthenticationProviders());
...
...
return $next($request);
}
}
在一个完整的 restful Laravel 项目中,我使用的是 dingo/api
包。在处理任何请求之前,我需要设置一些与当前用户相关的配置和其他内容。我们在使用dingo的时候,可以这样访问当前用户:
$user = app('Dingo\Api\Auth\Auth')->user();
首先我认为我应该在服务提供商中执行此操作。但是那里的 Laravel 还没有启动 dingo 验证,因此它给我一个错误。然后我想我需要编辑名为 api.auth
的 dingo auth 中间件来执行此操作。它在我的路线上的用法是这样的:
<?php
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', ['prefix' => 'v1', 'namespace' => 'App\Http\Controllers'], function ($api) {
$api->group(['prefix' => 'admin', 'middleware' => 'api.auth'], function ($api) {
$api->get('checkRole/{branch_id}', 'RoleController@getRoles');
但我无权访问它,因为它是 dingo 包中的内置中间件。那么遇到这种情况该怎么办呢?
我自己解决了这个问题,但我忘了在这里回答。
我只是扩展了 digo auth 中间件并覆盖了它的 handle
方法。但是我不得不通过项目中的所有路由文件替换中间件名称(我正在使用 nwidart/laravel-modules
包来编写模块化项目)。
<?php
namespace App\Http\Middleware;
use Closure;
use Dingo\Api\Http\Middleware\Auth;
class ApiAuth extends Auth
{
public function handle($request, Closure $next)
{
$route = $this->router->getCurrentRoute();
if (!$this->auth->check(false))
$this->auth->authenticate($route->getAuthenticationProviders());
...
...
return $next($request);
}
}