我有一个用户类,它包含两种类型的用户,并希望允许不同的用户转到不同的页面。
我创建了一个过滤器,如下所示
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 :: logout()不起作用?我已经尝试将它放在应用程序的任何地方都无济于事。
欢呼声
答案 0 :(得分:8)
我有同样的问题,我真的无法注销当前用户......答案很简单:Laravel不支持使用Auth :: basic()注销logout()。
有办法解决它,但它不是很干净; https://www.google.nl/search?q=logout+basic
答案 1 :(得分:4)
这不是对Laravel的限制,HTTP基本授权不是为处理注销而设计的。客户端将保持登录状态,直到浏览器关闭。
HTTP基本授权确实不应该在任何公共生产环境中使用。以下是一些原因:
我能想到的唯一有效案例是保护公共开发子域名,例如dev.example.com,但也有更好的方法来解决这个问题。
答案 2 :(得分:3)
我找到的最简单的方法是在注销路线上重定向到无效的用户名/密码。例如:
Route::get('admin/logout', function() {
return Redirect::to(preg_replace("/:\/\//", "://log-me-out:fake-pwd@", url('admin/logout')));
});
答案 3 :(得分:1)
如果您在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数据库中的表'users',然后注销,最后成功解决。 交替你使用这个SQL命令:
ALTER TABLE users ADD remember_token TEXT;
然后按“开始”按钮。