2016-11-19 30 views
0

我登錄到我的網站和我目前的頁面需要admin中間件。我也從本頁獲得了api電話。這個API調用也通過相同的admin中間件,並且在api.php文件(laravel 5.3)中。我對網頁的請求有效。但是,我的api調用中間件返回302將我重定向到login頁面。我與Auth::actingas($user)這個API調用的測試用例也很好。中間件似乎並不認識到即使頁面沒有登錄。Laravel中間件返回405時使用ajax

我也已將api/*添加到VerifyCSRF的例外列表中。我怎樣才能解決這個問題?

這是我的routes/web.php文件(我目前在頁面manageAdmins

Route::group(['prefix' => 'admin', 'middleware' => ['admin']], function(){ 
    Route::get('/', '[email protected]'); 
    Route::get('categories', '[email protected]'); 
    Route::get('categories/add', '[email protected]'); 
    Route::get('manageAdmins', '[email protected]'); 

}); 

routes/api.php文件:

<?php 

use Illuminate\Http\Request; 

/* 
|-------------------------------------------------------------------------- 
| API Routes 
|-------------------------------------------------------------------------- 
| 
| Here is where you can register API routes for your application. These 
| routes are loaded by the RouteServiceProvider within a group which 
| is assigned the "api" middleware group. Enjoy building your API! 
| 
*/ 

Route::get('/user', function (Request $request) { 
    return $request->user(); 
})->middleware('auth:api'); 

Route::get('categories/{id}/children', '[email protected]'); 

Route::group(['prefix' => 'admin', 'middleware' => ['web', 'admin']], function() { 
    Route::put('makeNormalUserOfAdmin/{id}', '[email protected]'); 
}); 

這裏的API調用的管理中間件:

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Auth; 

class Admin 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next, $guard=null) 
    { 
     if (!(Auth::guard($guard)->check())) { 
      return redirect('/login'); 
     } 
     if(!(Auth::user()->is_admin)){ 
      return redirect('/home'); 
     } 
     return $next($request); 
    } 
} 

下面是失敗的api調用:

/** 
* delete an admin from the database 
*/ 
function deleteAdmin(id){ 
    $.ajax({ 
     method: "PUT", 
     url: "/api/admin/makeNormalUserOfAdmin/" + id, 
     error: function(data){ 
      alert('error'); 
     }, 
     success: function(data){ 
      $("table#admins tr#id" + id).fadeOut(); 
     } 
    }); 
} 

,並最後在這裏是通過測試案例:

<?php 

use Illuminate\Foundation\Testing\DatabaseMigrations; 
use App\User; 

class MakeNormalUserOfAdminTest extends TestCase 
{ 
    use DatabaseMigrations; 

    /** 
    * Test the get categories method 
    * 
    * 
    */ 
    public function testMakeNormalUserOfAdmin() 
    { 

     $miscalaneousUsers = factory(App\User::class, 20)->create(); 

     $user = factory(App\User::class)->create([ 
      'is_admin' => true 
     ]); 

     $this->actingAs($user) 
      ->json("PUT", "api/admin/makeNormalUserOfAdmin/$user->id") 
      ->assertResponseOk() 
      ->assertResponseStatus(200); 

     $this->seeInDatabase('users', [ 
      'id' => $user->id, 
      'name' => $user->name, 
      'password' => $user->password, 
      'remember_token' => $user->remember_token, 
      'updated_at' => $user->updated_at, 
      'created_at' => $user->created_at, 
      'is_admin' => 0 
     ]); 

     $this->dontSeeInDatabase('users', [ 
      'is_admin' => 1 
     ]); 

    } 
} 

回答

-1

PHP不與_method=put體場發送POST處理PUT請求,所以laravel模仿它。所以,爲了你的要求工作,你需要添加數據

data: { 
    _token: csrfToken, 
    _method: 'put' 
} 

和變更請求方法爲POST

+0

爲什麼下降投票?這個答案是合理的。 – Kyslik

+0

不知道要公平:/ – Skysplit