私のプロジェクトでは、Laravelを純粋にバックエンドAPIとして使用しており、すべてのフロントエンドはAngular javascript。現時点では、Laravelルートに直接アクセスでき、ブラウザに表示されるJsonのすべてのデータが出力されます。制限を設定して、Laravel Ajaxリクエストにのみ応答するようにします。何もありません。
私はこの投稿を読みました ここ これはLaravel 4の解決策があり、それはfilter.php
に制限を追加することです。しかしLaravel 5.1、フィルターは使用されなくなり、ミドルウェアを使用して同じことができると思います。ただし、Laravel 4ソリューションを変更する方法がわかりません= SOフィルターからミドルウェアへの回答。
誰かがLaravel 5.1ルートに直接アクセスされないようにする方法についてあなたのアイデアを共有できますか?
filter.php
を使用したLaravel4ソリューション:filter.php
で次のフィルターを宣言します。
Route::filter('isAJAX', function()
{
if (!Request::AJAX()) return Redirect::to('/')->with(array('route' => Request::path()));
});
次に、AJAX経由でのみアクセスしたいすべてのルートをグループに入れます。routes.php内:
Route::group(array('before' => 'isAJAX'), function()
{
Route::get('contacts/{name}', ContactController@index); // Or however you declared your route
... // More routes
});
次の内容でミドルウェアファイルapp/Http/Middleware/OnlyAjax.php
を作成します。
<?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);
}
}
次に、ミドルウェアをファイル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,
];
}
そして最後に、AJAX経由でのみアクセス可能にしたいルートまたはルートのグループにミドルウェアを接続します。つまり:
/// File: routes/web.php
// Single route
Route::any('foo', 'FooController@doSomething')->middleware('ajax');
// Route group
Route::middleware(['ajax'])->group(function () {
// ...
});