在Laravel中使用HTTP Basic Auth注销

时间:2013-08-18 05:23:54

标签: php laravel laravel-4 authorization basic-authentication

我有一个用户类,它包含两种类型的用户,并希望允许不同的用户转到不同的页面。

我创建了一个过滤器,如下所示

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()不起作用?我已经尝试将它放在应用程序的任何地方都无济于事。

欢呼声

4 个答案:

答案 0 :(得分:8)

我有同样的问题,我真的无法注销当前用户......答案很简单:Laravel不支持使用Auth :: basic()注销logout()。

有办法解决它,但它不是很干净; https://www.google.nl/search?q=logout+basic

答案 1 :(得分:4)

这不是对Laravel的限制,HTTP基本授权不是为处理注销而设计的。客户端将保持登录状态,直到浏览器关闭。

HTTP基本授权确实不应该在任何公共生产环境中使用。以下是一些原因:

  • 无法在登录表单上为用户提供"记住我" -option。
  • 密码管理员没有或缺乏对HTTP Basic Auth的支持,因为它不是呈现HTML而是原生弹出窗口。
  • 糟糕的用户体验。将合适的登录表单放在一起非常值得花一点时间。

我能想到的唯一有效案例是保护公共开发子域名,例如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;

然后按“开始”按钮。