6

Projemde, Laravel'i yalnızca arka uç api olarak kullanıyorum ve tüm frontend Angular javascript tarafından kullanılıyor. Şu anda, Laravel rotalarına doğrudan erişilebilir ve tarayıcıda gösterilen Json'daki tüm verileri öksürecek. Üzerinde bir kısıtlama getirmek istiyorum, bu yüzden Laravel sadece Ajax isteklerine ve başka hiçbir şeye yanıt vermiyor.Laravel Rotalarının doğrudan erişilmesi nasıl engellenir (örn., Ajax istemleri hariç)

Bu gönderiyi filter.php içine ekleyerek Laravel 4 için bir çözümü olan here okudum. Ama Laravel 5.1'den itibaren, filtreler artık kullanılmıyor ve Middleware'in aynı şeyi yapmak için kullanılabileceğine inanıyorum. Ancak, filtreden Middleware'e verilen SO cevabındaki Laravel 4 çözümünü nasıl değiştireceğime emin değilim.

Laravel 5.1 yollarının doğrudan erişilmesini nasıl engelleyeceğiniz konusunda fikirlerinizi paylaşabilir mi?

laravel filter.php kullanılarak 4 çözeltisi: bu filtrenin beyan filter.php yılında:

Route::filter('isAJAX', function() 
{ 
    if (!Request::AJAX()) return Redirect::to('/')->with(array('route' => Request::path())); 
}); 

O halde tek bir gruba AJAX üzerinden erişilebilir istiyorum tüm yolları koydu. senin routes.php olarak:

Route::group(array('before' => 'isAJAX'), function() 
{ 
    Route::get('contacts/{name}', [email protected]); // Or however you declared your route 

    ... // More routes 
}); 

cevap

18

bu içerikle katman dosyası app/Http/Middleware/OnlyAjax.php oluşturun:

<?php namespace App\Http\Middleware; 

class OnlyAjax 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, \Closure $next) 
    { 
     if (! $request->ajax()) 
      return response('Forbidden.', 403); 

     return $next($request); 
    } 
} 

Sonra dosyasında app/Http/Kernel.php

<?php namespace App\Http; 

use Illuminate\Foundation\Http\Kernel as HttpKernel; 

class Kernel extends HttpKernel 
{ 
    /** 
    * The application's global HTTP middleware stack. 
    * 
    * @var array 
    */ 
    protected $middleware = [ 
     //... your original code 
    ]; 

    /** 
    * The application's route middleware. 
    * 
    * @var array 
    */ 
    protected $routeMiddleware = [ 
     //... your original code 
     'ajax' => \App\Http\Middleware\OnlyAjax::class, 
    ]; 
} 

sizin ortakatmanını kayıt Ve nihayet orta katman eklemek Sadece AJAX üzerinden erişilebilir yapmak istediğiniz herhangi bir rota. i.e:

// File: app/Http/routes.php 
post('search/{model}', ['as' => 'search', 'middleware' => 'ajax', 'uses' => '[email protected]']); 
+0

Bu harika! Tam olarak ihtiyacım olan şey. Çok teşekkürler @JaviStolz Bu uzun zamandan beri takıldığımdan beri muazzam bir yardım. V mutlu :) Bunu şimdi deneyeceğim. – Neel

+1

Bu, HTTP isteklerine el ile bir "X-Talep Edilen-Birlikte: XMLHttpRequest" HTTP başlığı ekleyerek kolayca atlanabilir. – Epoc

+0

Başka bir şey, yalnızca belirli bir etki alanındaki isAjax middleware ile isteklere izin vermek için cors filtreleri kullanmak olacaktır. –

İlgili konular