检查“其他”用户是不是使用 Laravel 5 登录/注销
Posted
技术标签:
【中文标题】检查“其他”用户是不是使用 Laravel 5 登录/注销【英文标题】:Checking if "other" users is logged in/ logged out using Laravel 5检查“其他”用户是否使用 Laravel 5 登录/注销 【发布时间】:2016-06-21 09:11:10 【问题描述】:我正在创建一个类似于聊天应用程序的应用程序。
我希望能够确定用户是否已登录。
我这样做的方法是在 users
表中添加一个 is_logged_in
字段。
但是我不确定如何更新这个变量,因为我不知道在logout
期间调用了什么方法。
我想应该是这样的:
class AuthController extends Controller
//...
public function login($user)
$user->is_logged_in = true;
$user->save();
public function logout($user)
$user->is_logged_in = false;
$user->save();
//...
当然login
和logout
不是在用户实际登录和注销时运行的方法,但我不确定将逻辑放在哪里。
更新
这些是用于身份验证的路由。
Route::get('login', 'Auth\AuthController@getLogin')->name('login');
Route::post('login', 'Auth\AuthController@postLogin')->name('postLogin');
Route::get('logout', 'Auth\AuthController@getLogout')->name('logout');
Route::get('register', 'Auth\AuthController@getRegister')->name('register');
Route::post('register', 'Auth\AuthController@postRegister')->name('postRegister');
编辑 我知道我可以检查当前用户是否已通过以下方式进行身份验证:
Auth::check()
但是,这无助于确定其他用户是否已登录
【问题讨论】:
您可以使用 Session::set() 和 Session::get() 方法来处理登录。最后可以使用 Laravel 中的 Session::flush() 方法来注销用户。跨度> 我认为与我的相比,这是一个糟糕的解决方案,因为身份验证特征中有很多逻辑无法运行。而且与使用事件相比,它要复杂得多! 【参考方案1】:class AuthController extends Controller
//...
public function login($user)
// You can choose to check if the user is logged in
// before you authenticate the user but its not really necessary because it can cause issues
if(Auth::check())
// user is logged in
else
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1]))
// The user is active, not suspended, and exists.
public function logout($user)
if(!Auth::check())
// user is logged out
else
Auth::logout();
已编辑
我想你想知道身份验证是否真的发生了(laravel 5.2)
您可以检查 AuthenticatesUsers 特征。那就是调用 getLogin() 函数
【讨论】:
我认为这行不通,因为这些方法甚至都无法运行!我把dd("hi
)`放在方法的顶部,它们没有运行!我的代码中的示例只是一个示例。我需要一个地方放我的代码
你是怎么登录的用户
使用Route::get('login', 'Auth\AuthController@getLogin')->name('login');
并且我没有创建一个名为“getLogin”的方法。它是自动完成的!
使用这个登录 if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) // The用户处于活动状态,未挂起且存在。
你能把它放在你的答案中,因为我看不到它的正确信息【参考方案2】:
从 Laravel 文档中找到 here。
确定当前用户是否经过身份验证
要确定用户是否已经登录到您的应用程序,您 可以使用 Auth 门面的 check 方法,如果 用户已通过身份验证:
if (Auth::check())
// The user is logged in...
【讨论】:
但这无助于确定其他用户是否已登录。我正在像聊天应用程序一样创建。【参考方案3】:解决方案 1:编辑用户控制器 [不推荐]
在仔细检查了 AuthicatesUsers
特征后,我设法解决了这个问题:
我在User
模型中添加了如下方法;
public function authenticated($request, User $user)
$user->is_logged_in = true;
$user->save();
return redirect()->intended($this->redirectPath());
public function getLogout()
if (Auth::check())
$user = Auth::user();
$user->is_logged_in = false;
$user->save();
Auth::logout()
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
解决方案 2:使用事件 [推荐]
我发现解决方案 1 可能不是最佳方式,因为用户可以通过其他方式登录(例如社交身份验证)。
因此最好使用事件。即将这些添加到EventServiceProvider
boot
方法中:
public function boot(DispatcherContract $events)
parent::boot($events);
$events->listen('auth.login', function (User $user, $remember)
$user->is_logged_in = true;
$user->save();
);
$events->listen('auth.logout', function (User $user)
$user->is_logged_in = false;
$user->save();
);
【讨论】:
【参考方案4】:如果您正在尝试创建一个聊天应用程序,并且您想知道其他用户是否已登录(或者,更具体地说,是否积极参与聊天),您最好使用基于事件的方法,使用 Pusher 之类的服务来识别正在收听给定频道的特定用户。数据库从来都不是跟踪用户登录状态的有效场所,因为用户可以简单地关闭浏览器,有效地使他们注销,但数据库不会知道。您可以执行一些操作,例如查看用户的上次活动并在每次请求时更新该活动,但是这种类型的方法不会考虑长时间处于空闲状态而未注销但仍可用于聊天的用户。系统会查看他们的最后操作时间并认为他们已注销,而实际上他们并未注销。
因此,您唯一可以可靠地做的就是打开一个事件广播频道,然后所有其他客户端都可以访问该频道的其他活动“听众”。当用户关闭他们的浏览器时,它会关闭他们与通道的连接,然后立即传播给所有其他用户。如果你不了解 Laravel 内置的这些类型的基于事件的频道功能,我真的建议你观看 Jeffrey Way's laracasts on Laravel Echo。在较新版本的 Laravel 上实现起来更容易,但功能非常强大。
【讨论】:
以上是关于检查“其他”用户是不是使用 Laravel 5 登录/注销的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.4 检查用户是不是处于活动状态,如果没有则回复消息
使用 Session ID 检查会话是不是处于活动状态 - Laravel
Laravel 5.1 - 注册用户时应用重定向到 /dashboard 但不检查帐户是不是已确认