我正在创建一个类似于聊天应用程序的应用程序。
我希望能够确定用户是否已登录。
我这样做的方法是在is_logged_in
表中添加users
字段。
但我不确定如何更新此变量,因为我不知道在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()
但是,这无法确定其他用户是否已登录
答案 0 :(得分: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()函数被调用
答案 1 :(得分:1)
解决方案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();
});
}
答案 2 :(得分:1)
如果您尝试创建聊天应用程序,并且想知道其他用户是否已登录(或者更确切地说,活跃于聊天中),则最好使用基于事件的方法,使用Pusher之类的服务来识别在给定频道上收听的特定用户。数据库永远不是跟踪用户登录状态的有效场所,因为用户可以简单地关闭其浏览器,从而有效地使他们注销,但是数据库不会知道它。您可以执行一些操作,例如查看用户的上一个活动并根据每个请求更新该活动,但是这种方法无法解决长时间闲置而未注销但仍然可以聊天的用户。系统将查看他们的上次操作时间,并认为未登录时已注销。
因此,您唯一可以可靠地做的就是打开事件广播频道,然后所有其他客户端都可以访问该频道的其他活动“侦听器”。当用户关闭浏览器时,它会关闭与通道的连接,然后该通道立即传播到所有其他用户。如果您不了解Laravel内置的这些基于事件的通道功能,我真的建议您观看Jeffrey Way's laracasts on Laravel Echo。在较新版本的Laravel上实现起来比较容易,但是功能非常强大。
答案 3 :(得分:0)
从Laravel文档中找到here。
确定当前用户是否经过身份验证
要确定用户是否已登录您的应用程序,您 可以在Auth Facade上使用check方法,如果是,则返回true 用户已通过身份验证:
if (Auth::check()) {
// The user is logged in...
}