0

甚至可以在一条路线中拥有多个中间件。现在我有我的网络应用程序使用 auth 的中间件发出 ajax 请求,该中间件默认为 auth:web

Route::post('/user/postAuthUserInfoAjax', [
  'uses' => 'UserController@postAuthUserInfoAjax',
  'middleware' => ['auth'],
]);

我还希望我的移动应用程序具有 API 访问令牌(使用 laravel 护照)来验证用户是否能够访问这些相同的路由。为此,我只需在中间件中指定“auth:api”。

Route::post('/user/postAuthUserInfoAjax', [
  'uses' => 'UserController@postAuthUserInfoAjax',
  'middleware' => ['auth:api'],
]);

唯一的问题是我不能指定多个中间件。我可以使用 'auth:api' 或 'auth:web' 但不能同时使用。我想我可以为每个 ajax 请求设置两条路由,一条用于 Web 应用程序,另一条用于 api 请求,但如果我可以只使用一条路由会好得多。

我试过了,但它不起作用。有谁知道如何做到这一点?有没有可能

 Route::post('/user/postAuthUserInfoAjax', [
  'uses' => 'UserController@postAuthUserInfoAjax',
  'middleware' => ['auth:web','auth:api'],
]);
4

1 回答 1

0

这不起作用,因为您说的是以下内容:

在处理此请求之前,请验证用户是否已通过 Web 提供程序进行身份验证,但是,他们也必须通过我的 api 提供程序进行身份验证。

您可以解决此问题的一种方法是只拥有两个控制器,但扩展一个基本控制器,其中包含已经内置的功能:

App
|
---- Http
     |
     ---- Controllers
          |
          ---- UserController (this will be our base)
          ---- API
               |
               ---- UserController (will extend the base)
          ---- Web
               |
               ---- UserController (will extend the base)

然后你应该相应地设置路由组:

//Your "web provider" authenticated routes
Route::group(['middleware' => ['auth:web'] 'namespace' => 'Web', function(){

});

然后对于您的 API 请求:

//your "api provider" authenticated routes
Route::group(['middleware' => ['auth:api'], 'namespace' => 'API', function(){

});

这是我们将放在两个组中的路线:

Route::post('user/info', 'UserController@info');

然后基本控制器应该看起来像这样:

class UserController extends App\Http\Controller {

   /**
    * Update the specified User Resource
    *
    * @param Illuminate\Http\Request $request
    * @param App\User $user
    * 
    * @returns mixed
    */
    public function update(Illuminate\Http\Request $request, App\User $user)
    {
        if ($request->ajax()) {
            try {
                DB::transaction(function() use ($request, $user) {
                    $user->update($request->only($user->getFillable()));
                });

                DB::commit();
            } catch (\Exception $e){
                DB::rollback();
                return response()->json($e->getMessage(), 422);
            }
        }
    }
}

请注意,我在没有访问实际代码的情况下键入此内容,因此$user->getFillable()可能会返回一个集合,要求您将其转换为数组。如果是这种情况,只需链接$user->getFillable()->toArray()到最后。

这其中的神奇之处在于,如果进程请求成功,您可以.done()在 promise 对象上捕获它。如果失败,那么您将收到一条422 Unprocessable Entity in Request消息,该消息将触发您.fail()对 promise 对象的访问。

UserController现在,只需从您的两个API/WebUserController扩展这个基础:

<?php

namespace App\Http\Controllers\Api;

class UserController extends App\Http\Controllers\UserController {

}

虽然您必须做一些重复的逻辑,但为了清晰起见,在整个应用程序堆栈中保持这种级别的分离非常重要。如果您仍需要更改任一路线的内容,此方法仍将允许您进行一定程度的精细控制,但为您提供了工作的基础。

希望这会有所帮助。

于 2016-11-27T21:46:07.220 回答