В моем приложении laravel 5 есть функция, позволяющая пользователям с ролью администратора сбросить пароли никому, кроме администратора, однако это не заставляет человека выйти из системы и снова войти в систему. Как заставить пользователя выйти из системы после изменения пароля? Я не внес никаких изменений в промежуточное программное обеспечение для аутентификации пользователей или чего-либо еще.Laravel 5 Logout Конкретный пользователь
ответ
Я считаю, что самым быстрым решением является добавление флага в таблицу DB пользователей, например булевский столбец to_logout
, а в промежуточном программном обеспечении Auth добавить что-то вроде этого кода.
$user = Auth::user();
if($user->to_logout){
Auth::logout();
$user->update(['to_update' => 0]);
return redirect('/');
}
Если вы используете Laravel 5.2, вы можете изменить механизм хранения сеанса в базу данных. В этом случае каждая запись сеанса также будет содержать идентификатор пользователя.
Все что вам нужно, это просто удалить соответствующую строку из базы данных.
Оглядываясь на docs, не существует встроенной функции для этого, и аналогичный запрос имеет been proposed, в котором также описывается проблема отслеживания одного пользователя, который имеет несколько сеансов, открытых на нескольких устройствах.
Я считаю, что вам нужно будет создать собственное решение, например (как упоминалось в @Dinar), если вы храните пользовательские сеансы в базе данных, тогда вы можете получить и уничтожить сеанс конкретного пользователя при выполнении определенного условия - изменение их пароль.
Я не знаю, если это будет работать, но вы можете попробовать:
// get current user
$user = Auth::user();
// logout user
$userToLogout = User::find(5);
Auth::setUser($userToLogout);
Auth::logout();
// set again current user
Auth::setUser($user);
Это то, что я искал! Благодаря! – BakerStreetSystems
Пытаясь избежать дополнительных сложностей, такие как добавление полей в БД, после того, как немного расследования я наткнулся на следующее решение.
Идея основана на Laravel 5.4, но должна быть совместима со всеми выпусками 5.x.
Проблема заключается в том, что Laravel обрабатывает выход из системы. Как мы можем видеть в https://github.com/laravel/framework/blob/5.4/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php#L154
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return redirect('/');
}
Линия $request->session()->invalidate();
выполняет сброс данных запроса сеанса и регенерировать идентификатор. Итак, после этого, если бы у нас было много охранников, все они будут выведены из системы.
Идея состоит в том, чтобы удалить только один ключ сеанса, который соответствует текущему пользователю, которого мы выходим. Если мы исследуем нашу сессию (обратите внимание на «login_ *» клавиши), в то время как пользователи из разных охранников вошли в систему, мы получим что-то вроде этого:
array:5 [▼
"_token" => "qB4zDqDbknpO7FOrfNQ3YuFxpnji95uamJflxSkV"
"_previous" => array:1 [▶]
"_flash" => array:2 [▶]
"login_admin_51ba36addc2b2f9401580f014c7f58ea4e30989d" => 74
"login_user_51ba36addc2b2f9401580f014c7f58ea4e30989d" => 23
]
Вместо промывки всей сессии, нам просто нужно удалите этот сингл, соответствующий ключ. Чтобы получить текущее имя сеанса охраны (ключ сеанса в примере выше), мы можем использовать метод защиты: https://github.com/laravel/framework/blob/5.4/src/Illuminate/Auth/SessionGuard.php#L622
Теперь у нас есть все необходимое для выполнения этой задачи. Вот пример из проекта, я в данный момент:
namespace App\Http\Controllers\Admin\Auth;
use Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
use AuthenticatesUsers;
public function __construct()
{
$this->middleware('guest:admin', ['except' => 'logout']);
}
protected function guard()
{
return Auth::guard('admin');
}
public function logout()
{
// Get the session key for this user
$sessionKey = $this->guard()->getName();
// Logout current user by guard
$this->guard()->logout();
// Delete single session key (just for this user)
$request->session()->forget($sessionKey);
// After logout, redirect to login screen again
return redirect()->route('admin.login');
}
// ... Other code ...
}
С LoginController::logout
метод мы перекрывая признака выхода из системы (по умолчанию Laravel выход из системы логики) с нашим обычаем, почти то же самое, но что позволит нам выйти из системы Один пользователь.
Такая же логика применяется ко всем нашим контроллерам входа в систему в зависимости от того, сколько у нас разных охранников.
Я только что закончил это решение и после быстрого тестирования, похоже, работает нормально, но перед его внедрением внимательно осмотрите его.
- 1. Laravel 5 logout не работает
- 2. Laravel 5 logout не работает должным образом
- 3. Laravel 5 Auth Logout не разрушая сеанс
- 4. Prestashop logout пользователь программно
- 5. Laravel 5.2 not logout
- 6. MVC 5 Identity Automatic Logout
- 7. Laravel 5 красноречиво: выбрать конкретный столбец отношения
- 8. Grails logout другой зарегистрированный пользователь
- 9. Asp.net Identity logout другой пользователь
- 10. Как отключить remeber_token, когда пользователь закрывает просматривание в Laravel 5
- 11. Laravel 5: изменить навигацию, если пользователь зарегистрирован
- 12. создать первый пользователь в Laravel 5
- 13. Как кэшировать текущий аутентифицированный пользователь? (Laravel 5)
- 14. Laravel 5 - FatalErrorException: Class 'Пользователь' не найден
- 15. Laravel 5 проверить, зарегистрирован ли пользователь в
- 16. Laravel 5.2 logout() не работает
- 17. Laravel 5.1 logout redirect не работает
- 18. django logout пользователь, основанный на имени пользователя
- 19. Tomcat logout другой пользователь как администратор
- 20. Laravel 5 защита маршрута
- 21. laravel 5 destroy session
- 22. Laravel eloquent получить конкретный пользователь с его отношениями
- 23. Переадресовать конкретный пользователь
- 24. Зачем вводить интерфейс, а не конкретный класс в Laravel 5. *?
- 25. Как установить laravel 5.3 logout перенаправить путь?
- 26. Laravel 5.2 multi auth logout не работает
- 27. Аутентифицировать пользователь Laravel
- 28. Laravel 5 - Laravel \ Collective
- 29. Laravel 5 - Use Auth :: Проверка() ввиду
- 30. laravel 5: Ошибка аутентификации маршрутов
Спасибо Клаудио, это именно то, что я и рассматривал. Я просто убедился, что делаю это правильно для Laravel. – Goderaftw
Я не думаю, что этот метод уничтожает все сеансы пользователя (например, если он вошел в систему на ПК и на мобильном устройстве одновременно) –