Laravel 通过 ajax 授权

Laravel auth via ajax

我为管理 ajax 请求编写控制器。我编写了用于检查用户登录与否的构造方法 if 块工作正常但总是 return user.setting 视图和 return 在构造中不起作用。

控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Auth;

class AjaxController extends Controller {

    public function __construct() {
        if (Auth::check() == FALSE) {
            return view('errors.notLogin');
        }
    }

    public function settings() {
        return view('user.setting');
    }

}

路线:

Route::post('ajax/settings', 'AjaxController@settings');

js:

acc_settings = function (url) {
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    $.ajax({
        url: url,
        type: 'POST',
        data: 'settings=settings',
        success: function (data) {
            $("#ajax").html(data);
        }
    });
};

您应该使用 middleware 而不是重新实现该功能。

public function __construct()
{
    $this->middleware('auth');
}

然后在 auth 中,您可以为 ajax 和常规 http 请求添加两种情况 -

public function handle($request, Closure $next)
{

    if ($this->auth->guest())
    {
        if ($request->ajax())
        {
            return view('errors.notLogin');
        }
        else
        {
            return redirect()->guest('auth/login');
        }
    }

    return $next($request);
}

这看起来像是中间件的工作。

Laravel Docs on Middleware

你不应该在你的 AjaxController 的构造函数中做任何事情,相反你应该为你想要保护的路由注册一个中间件:

Route::post('ajax/settings', [
    'uses' => 'AjaxController@settings', 
    'middleware' => 'auth'
]);

由于您可能需要许多 Ajax 函数,因此您可以使用相同的中间件和 "ajax" 前缀将它们全部分组:

Route::group(['prefix' => 'ajax', 'middleware' => 'auth'], function () {
    Route::post('settings', 'AjaxController@settings');
    //Define more routes here...
});

'auth'是Laravel自带的预置中间件之一,你可以在App\Http\Middleware\Authenticate找到它并根据需要修改,或者注册你自己的"Ajax"中间件.在任何一种情况下,您的句柄函数都将如下所示:

public function handle($request, Closure $next)
{
    if ($this->auth->guest()) {
        return view('errors.notLogin');
    }

    return $next($request);
}

你为什么不使用 Middleware

你的构造函数应该是:

 public function __construct() {
     $this->middleware('auth');
 }

您还可以在 routes.php 中的路由上将中间件分配给 运行:

Route::group(['middleware' => 'auth'], function () {
    Route::post('ajax/settings', 'AjaxController@settings');
}