Вопрос: Выход из протокола HTTP Basic Auth в Laravel


У меня есть один пользовательский класс, который состоит из двух типов пользователей и позволяет другим пользователям перейти на разные страницы.

Я создал фильтр следующим образом

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 ()? Я пробовал разместить его в любом месте приложения безрезультатно.

ура


6


источник


Ответы:


У меня была та же проблема, я действительно не мог выйти из текущего пользователя ... И ответ прост: Laravel не поддерживает logout () с Auth :: basic ().

Есть способы исправить это, но это не очень чисто; https://www.google.nl/search?q=logout+basic


7



Самый простой способ, который я нашел для этого, - перенаправить на неверный логин / пароль на маршруте выхода из системы. Пример:

Route::get('admin/logout', function() {
    return Redirect::to(preg_replace("/:\/\//", "://log-me-out:fake-pwd@", url('admin/logout')));
});

3



Это не является ограничением для Laravel, HTTP Basic Authorization не предназначена для обработки выхода из системы. Клиент останется включенным до закрытия браузера.

Базовая авторизация HTTP действительно не должна использоваться в любой публичной производственной среде. Вот несколько причин:

  • Невозможно дать пользователям «запомнить меня» -опцию в форме входа.
  • Менеджеры паролей не имеют или не имеют поддержки HTTP Basic Auth, поскольку это не визуализированный HTML, а собственное всплывающее окно.
  • Ужасный пользовательский интерфейс. Составление правильной формы входа хорошо стоит того времени, которое требуется.

Единственным действительным случаем, о котором я могу думать, является защита общественных субдоменов, таких как dev.example.com, но есть и другие способы решения этой проблемы.


3



Если вы реализовали эти методы в 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;

а затем нажмите кнопку «Go».


0