如何防止直接访问 Laravel 路由(即非 ajax 请求)
How to prevent Laravel Routes from being accessed directly (i.e. non-ajax requests)
在我的项目中,我使用 Laravel 纯粹作为后端 api,所有前端都由 Angular javascript 处理。目前,可以直接访问 Laravel 路由,它会将 Json 中的所有数据显示在浏览器中。我想对其进行限制,以便 Laravel 仅响应 Ajax 请求而不响应其他请求。
我读了这篇 post here,它有一个针对 Laravel 4 的解决方案,即在 filter.php
中添加一个限制。但是从 Laravel 5.1 开始,不再使用过滤器,我相信可以使用中间件来做同样的事情。但是,我不确定如何继续将 SO 答案中的 Laravel 4 解决方案从过滤器更改为中间件。
有人可以分享您关于如何防止 Laravel 5.1 路由被直接访问的想法吗?
Laravel 4 使用 filter.php
的解决方案:
在 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 () {
// ...
});
在我的项目中,我使用 Laravel 纯粹作为后端 api,所有前端都由 Angular javascript 处理。目前,可以直接访问 Laravel 路由,它会将 Json 中的所有数据显示在浏览器中。我想对其进行限制,以便 Laravel 仅响应 Ajax 请求而不响应其他请求。
我读了这篇 post here,它有一个针对 Laravel 4 的解决方案,即在 filter.php
中添加一个限制。但是从 Laravel 5.1 开始,不再使用过滤器,我相信可以使用中间件来做同样的事情。但是,我不确定如何继续将 SO 答案中的 Laravel 4 解决方案从过滤器更改为中间件。
有人可以分享您关于如何防止 Laravel 5.1 路由被直接访问的想法吗?
Laravel 4 使用 filter.php
的解决方案:
在 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 () {
// ...
});