14

在我的项目中,我将 Laravel 纯粹用作后端 api,所有前端都由 Angular javascript 处理。目前,可以直接访问 Laravel 路由,它将在浏览器中显示 Json 中的所有数据。我想对其进行限制,因此 Laravel 只响应 Ajax 请求而没有其他响应。

在这里阅读了这篇文章,它为 Laravel 4 提供了一个解决方案,即在filter.php. 但从 Laravel 5.1 开始,不再使用过滤器,我相信中间件也可以用来做同样的事情。但是,我不确定如何继续将 Laravel 4 解决方案中的 SO 答案从过滤器更改为中间件。

有人可以分享您关于如何防止 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
});
4

1 回答 1

48

使用以下内容创建中间件文件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 访问的任何路由或路由组。IE:

/// File: routes/web.php

// Single route
Route::any('foo', 'FooController@doSomething')->middleware('ajax');

// Route group
Route::middleware(['ajax'])->group(function () {
    // ...
});
于 2015-09-15T11:33:15.910 回答