2015-10-05 113 views
0

我为管理ajax请求编写控制器。我编写了用于检查用户登录的构造方法if阻止工作正常但总是返回user.setting查看并返回构造不工作。通过ajax的Laravel身份验证

控制器:

<?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', '[email protected]'); 

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); 
     } 
    }); 
}; 

回答

2

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

Laravel Docs on Middleware

你不应该在你的AjaxController的构造做什么,而不是你应该注册路线中间件要保护:

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

因为你可能需要多Ajax功能,您可以用同一个中间件将它们全部组合起来,而用“ajax”作为前缀:

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

'auth'是Laravel提供的预设中间件之一,您可以在App \ Http \ Middleware \中找到它,根据需要进行身份验证和修改,或注册您自己的“Ajax”中间件。在这两种情况下,你的处理函数看起来像:

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

    return $next($request); 
} 
3

您应该使用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); 
} 
0

你为什么不使用Middleware

你的构造应该是:

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

还可以指定中间件在routes.php文件的路线上运行:

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