2014-06-12 30 views
2

之後抑制Laravel日誌中的堆棧跟蹤轉儲我爲Laravel 4.1應用程序設置了一個自定義Acl。在App :: abort(403)

我routes.php文件文件適用於一個前過濾器:

// Global authenticator 
Route::filter('auth.vle', function() 
{ 
    return (new vleAuth)->authenticate(); 
}); 
// Authenticate all requests, except those to /login, /logout and /forgottenpassword 
Route::whenRegex('/^(?!login|logout)(.*)$/', 'auth.vle'); 

和我vleAuth authenticate()方法:

public function authenticate() 
{ 
    $this->acl = new vleAclService(); 
    $endpoint = Route::current()->getAction()['controller']; 
    if (!$this->acl->validateEndpoint($endpoint)) { 
     Log::info('Routing', array(Route::current()->getUri(), $endpoint)); 
     App::abort(403, 'Unauthorized action.'); 
    } 
} 

當我訪問,我很榮幸的訪問,沒有問題的終結點;當我訪問一個我沒有權限訪問的端點時,我收到一條Forbidden - We're really sorry but you don't have the necessary permissions to access this page.消息,因此就「前端」而言,身份驗證工作正常,並且日誌中的路由信息​​承載此信息。

但是,每當我嘗試訪問我不是認證的一個端點,我也得到在Laravel傾倒堆棧跟蹤日誌

[2014-06-12 15:00:16] production.INFO: ROUTE VALIDATION ["[email protected]",false] [] 
[2014-06-12 15:00:16] production.ERROR: exception 'Symfony\Component\HttpKernel\Exception\HttpException' with message 'Unauthorized action.' in /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:875 
Stack trace: 
#0 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(211): Illuminate\Foundation\Application->abort(403, 'Unauthorized ac...') 
#1 /srv/api/laravel/app/controllers/vleAuth.php(104): Illuminate\Support\Facades\Facade::__callStatic('abort', Array) 
#2 /srv/api/laravel/app/controllers/vleAuth.php(104): Illuminate\Support\Facades\App::abort(403, 'Unauthorized ac...') 
#3 /srv/api/laravel/app/routes.php(20): vleAuth->authenticate() 
#4 [internal function]: {closure}(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request)) 
#5 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(199): call_user_func_array(Object(Closure), Array) 
#6 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(154): Illuminate\Events\Dispatcher->fire('router.filter: ...', Array, true) 
#7 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(1399): Illuminate\Events\Dispatcher->until('router.filter: ...', Array) 
#8 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(1262): Illuminate\Routing\Router->callRouteFilter('auth.vle', Array, Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request)) 
#9 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(1246): Illuminate\Routing\Router->callPatternFilters(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request)) 
#10 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(996): Illuminate\Routing\Router->callRouteBefore(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request)) 
#11 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(968): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request)) 
#12 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(738): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) 
#13 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(708): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request)) 
#14 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Http/FrameGuard.php(38): Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true) 
#15 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Session/Middleware.php(72): Illuminate\Http\FrameGuard->handle(Object(Illuminate\Http\Request), 1, true) 
#16 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Cookie/Queue.php(47): Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true) 
#17 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Cookie/Guard.php(51): Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true) 
#18 /home/vagrant/vleAppV2/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true) 
#19 /home/vagrant/vleAppV2/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(606): Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request)) 
#20 /home/vagrant/vleAppV2/public/index.php(49): Illuminate\Foundation\Application->run() 
#21 {main} [] [] 

我試圖抑制這一點,因爲我不不希望日誌堆滿堆棧痕跡;只是我自己錄製的日誌信息是我在日誌中實際需要的。

我已經嘗試通過在app/global.php註冊一個新的錯誤處理功能抑制它:

App::error(function(Exception $exception, $code) 
{ 
    // Don't log 403s 
    if ($exception instanceof Symfony\Component\HttpKernel\Exception\HttpException) { 
     return; 
    } 

    Log::error($exception); 
}); 

但這似乎並沒有什麼效果都沒有。

我也試過在try/catch塊內包裝App:abort()vleAuth.authenticate(),但Exception在這個捕獲之前似乎已經被處理了,所以它也沒有幫助。

我重新運行composer dump-autoload以重建所有適當的自動加載,並重新啓動服務器,以防在OpCache中幫助舊腳本。

有人可以告訴我我應該如何抑制這個堆棧跟蹤?

+0

如果你在try/catch中包裝你的'App :: abort'調用,並且'App :: error'回調仍在被調用,那麼最有可能的罪魁禍首似乎是使用錯誤的名稱空間,或者你的文件沒有被正確更新(是由於源代碼控制,opcache或其他)。 – Andreas

回答

1

的解決辦法是在返回從自定義錯誤處理功能,而不是一個空返回的響應

App::error(function(Exception $exception, $code) 
{ 
    // Don't log 403s 
    if ($exception instanceof Symfony\Component\HttpKernel\Exception\HttpException) { 
     return Response::view('errors.403', array(), 403); 
    } 

    Log::error($exception); 
}); 

這仍然正確顯示403頁,但覆蓋調用一個正在生成堆棧跟蹤的默認錯誤處理程序