2013-08-18 126 views
6

我有一個用戶類,它由兩種類型的用戶組成,並希望允許不同的用戶訪問不同的頁面。在Laravel中使用HTTP基本身份驗證進行註冊

我創建了一個過濾器如下

Route::filter('isExpert', function() 
{ 
    $userIsExpert = 0; 
    $userIsLoggedIn = Auth::check(); 
    if ($userIsLoggedIn && Auth::user()->role == 'expert') { 
    $userIsExpert = 1; 
    } 

    Log::info('Logged in: ' . $userIsLoggedIn . ' && Expert: ' . $userIsExpert); 
    if ($userIsExpert == 0) 
    { 
     Log::info('should be logging out now.'); 
     Auth::logout(); 
     return Auth::basic(); 
    } 
}); 

和路由像這樣

Route::get('/winners', array('before' => 'isExpert', function() 
{ 
    $winners = DB::select('select * from winners'); 
    return View::make('winners.index')->with('winners',$winners); 
})); 

的想法是這樣的:如果它不是一個專家,它會註銷並重定向到登錄頁面。如果是,它將繼續。 但是,Auth :: logout();永遠不會註銷用戶。

問題

爲什麼不AUTH ::註銷()工作?我試過把它放在應用程序的任何地方都無濟於事。

歡呼

+1

嘗試重定向到其他路由而不是返回'Auth :: basic()'響應。技術上你的代碼應該工作。您也可以在註銷後嘗試'dd(Auth :: check())',看看註銷是否正常工作。 –

+0

好的。重定向功能起作用,我可以放在視圖中並將其彈出。 Auth :: logout()在應用程序中的任何位置都不起作用。任何想法爲什麼? –

回答

7

我有同樣的問題,我真的無法註銷當前用戶......答案是簡單的:Laravel不支持退出()與驗證::基本的()。

有辦法解決它,但它不是很乾淨; https://www.google.nl/search?q=logout+basic

3

我發現的最簡單的方法是在註銷路由上重定向到無效的用戶名/密碼。示例:

Route::get('admin/logout', function() { 
    return Redirect::to(preg_replace("/:\/\//", "://log-me-out:[email protected]", url('admin/logout'))); 
}); 
+0

每當我嘗試這個,我得到500服務器錯誤,因爲它在重定向循環。 – Kingsley

3

這不是對Laravel的限制,HTTP基本授權不是爲了處理註銷而設計的。客戶端將保持登錄狀態,直到瀏覽器關閉。

HTTP基本授權確實不應該在任何公共生產環境中使用。以下是一些原因:

  • 沒有辦法給用戶「記住我」 - 選擇登錄表單。
  • 密碼管理員沒有或缺少對HTTP Basic Auth的支持,因爲它不是呈現HTML,而是一個本地彈出窗口。
  • 糟糕的用戶體驗。將適當的登錄表格放在一起非常值得花費一點時間。

我能想到的唯一有效的例子就是保護公共開發子域,比如dev.example.com,但也有更好的方法來解決這個問題。

0

如果您在user.php的

實施這些方法
/** 
* Get the e-mail address where password reminders are sent. 
* 
* @return string 
*/ 
public function getReminderEmail() 
{ 
    return $this->email; 
} 

public function getRememberToken() 
{ 
    return $this->remember_token; 
} 

public function setRememberToken($value) 
{ 
    $this->remember_token = $value; 
} 
    public function getRememberTokenName() 
{ 
    return 'remember_token'; 
} 

名爲「remember_token」你的表「用戶」在MySQL數據庫中添加新列,然後註銷,終於成功地解決了。 交替您表使用SQL命令:

ALTER TABLE users ADD remember_token TEXT; 

,然後按「開始」按鈕。

相關問題