2014-03-26 32 views
1

我在Laravel有一個無限重定向循環,帶有認證過濾器。Laravel 4:帶有認證過濾器的重定向循環

在我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

可能重複[如何爲laravel全局過濾器定義異常路由?](http://stackoverflow.com/questions/14702547/how-to-define-exception-route-for-laravel-global - 過濾器) – Stromgren

回答

1

你可以做這樣的事情:

Route::filter('auth', function() 
{ 
    if (Request::segment(2) != 'login' && Auth::guest()) 
    { 
     return Redirect::guest('administrator/login'); 
    } 
}); 

而這裏的另一種方式:

Route::get('administrator/login', '[email protected]'); 

Route::group(array('before'=>'auth'), function(){ 
    Route::resource('administrator', 'AdministratorController'); 
}); 

第一條路線將捕獲請求路由到getLogin功能的過濾前組。

+0

它不起作用。其他路線不再適用於添加此路線 – bidou88

+0

我意識到我在那裏有一個錯字,你有沒有抓到? – Stromgren

+0

不在哪裏?我檢查了但不起作用 – bidou88

1

如果您嘗試創建一個足智多謀的控制器(通過使用Route :: resource()),那麼您的方法名稱是錯誤的。然而http://laravel.com/docs/controllers#resource-controllers

,如果你想創建一個RESTful的控制器(這好像你正在試圖做的,你的方法名在你的控制器判斷:請在這裏看到的Laravel文檔上足智多謀的控制器),那麼你會使用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'); 
    } 
}); 
+0

是的,那是我的一個錯誤;)我也有postSignin方法來進行驗證。我會把我的完整代碼放在一個新的答案中。謝謝 – bidou88

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

利用這種結構,這是工作!感謝您的幫助