Laravel 4:带有身份验证过滤器的重定向循环

时间:2014-03-26 13:22:56

标签: laravel laravel-4

我在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之外,最好的方法是什么?

由于

3 个答案:

答案 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'));
    }
}
}

使用此配置,它正在工作!谢谢你的帮助