我在Laravel中使用了身份验证过滤器进行了无限重定向循环。
在我的route.php中,我有:
Route::group(array('before'=>'auth'), function(){
Route::resource('administrator', 'AdministratorController');
});
这是我的控制器:
<?php
class AdministratorController extends BaseController {
protected $layout = "layouts.administrator";
public function __construct() {
$this->beforeFilter('auth', array('except' => 'getLogin'));
//$this->beforeFilter('csrf', array('on'=>'post'));
}
public function getLogin() {
$this->layout->content = View::make('administrator.login');
}
public function getDashboard() {
$this->layout->content = View::make('administrator.dashboard');
}
}
我的filters.php
Route::filter('auth', function()
{
if (Auth::guest()) return Redirect::guest('administrator/login');
});
我在我的控制器构造函数中添加了一个异常,但是之前发生了过滤器验证。那么,除了登录URI之外,最好的方法是什么?
由于
答案 0 :(得分:1)
你可以这样做:
Route::filter('auth', function()
{
if (Request::segment(2) != 'login' && Auth::guest())
{
return Redirect::guest('administrator/login');
}
});
这是另一种方式:
Route::get('administrator/login', 'AdministratorController@getLogin');
Route::group(array('before'=>'auth'), function(){
Route::resource('administrator', 'AdministratorController');
});
第一个路由将捕获请求并在过滤组之前路由到getLogin函数。
答案 1 :(得分:1)
如果您正在尝试创建一个资源丰富的控制器(通过使用Route :: resource()),那么您的方法名称是错误的。请参阅此处了解资源控制器上的Laravel文档:http://laravel.com/docs/controllers#resource-controllers
但是,如果您正在尝试创建 RESTful 控制器(您似乎正在尝试这样做,请根据控制器中的方法名称判断),那么您会使用Route :: controller()。
如果您确实使用第二个选项,那么您可以通过执行以下操作为登录方法指定路由名称:
Route::controller('administrator', 'AdministratorController', ['getLogin' => 'admin.login']);
然后,在您的filters.php中,修改auth过滤器:
Route::filter('auth', function()
{
if (Route::currentRouteName() != 'admin.login')
{
return Redirect::guest('administrator/login');
}
});
答案 2 :(得分:1)
routes.php文件
Route::controller('administrator', 'AdministratorController');
filters.php
Route::filter('auth', function()
{
if (Auth::guest())
{
return Redirect::guest('administrator/login');
}
});
AdministratorController.php
<?php
class AdministratorController extends BaseController {
protected $layout = "layouts.administrator";
public function __construct() {
$this->beforeFilter('auth', array('except' => array('getLogin', 'postSignin')));
//$this->beforeFilter('csrf', array('on'=>'post'));
}
public function getDashboard() {
$this->layout->content = View::make('administrator.dashboard');
}
public function getLogin() {
$this->layout->content = View::make('administrator.login');
}
public function postSignin() {
if (Auth::attempt(array('email' => Input::get('email'), 'password' => Input::get('password')))) {
return Redirect::to('administrator/dashboard');
} else {
return Redirect::to('administrator/login')
->withInput(Input::except('password'));
}
}
}
使用此配置,它正在工作!谢谢你的帮助