检查是否“其他”用户在/登录登出使用Laravel 5

问题描述 投票:2回答:4

我创建一个应用程序,它类似于一个聊天应用程序。

我希望能够确定一个用户登录或没有。

我这样做的方式是通过在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();
    }

    //...
}

当然,loginlogout并不运行在用户实际登录和注销的方法,但我不能确定的地方把逻辑。

更新

这些是认证的路由。

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()

然而,这并不能帮助确定是否有其他用户登录或不

laravel authentication controller laravel-5
4个回答
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:编辑用户控制器[NOT推荐]

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();
    });
}

1
投票

如果你想创建一个聊天应用程序,你想知道,如果另一个用户(或更具体地说,积极可供聊天)登录,你是最好的关闭使用使用服务像推基于事件的方式来确定特定用户正在侦听给定的通道。该数据库是永远不会跟踪用户的登录状态,用户可以简单地关闭浏览器的有效场所,有效地使他们退出,但数据库不会知道。您可以在用户的​​最后一项活动做类似的外观和更新在每次请求,但这种类型的方法将不能解释为闲置的未注销长的时间,但仍然是可以聊天的用户。该系统将看看他们的最后一个动作的时间,并认为他们注销,当他们没有。

所以,你可以可靠地做的唯一的事情是有一个事件广播信道开放,然后所有其他客户将有机会获得看到其他活动的“听众”的通道。当用户关闭他们的浏览器,它关闭其到通道,然后立即传播到所有其他用户的连接。如果你不知道这些类型的内置到Laravel基于事件的通道功能,我真的建议你看Jeffrey Way's laracasts on Laravel Echo。它更容易上Laravel的新版本,但非常强大的东西来实现。


0
投票

从Laravel文档中发现here

确定当前用户进行身份验证

要确定用户是否已经登录到您的应用程序,你可以使用在验证门面的检查方法,如果用户进行身份验证,这将返回true:

if (Auth::check()) {
    // The user is logged in... 
}
© www.soinside.com 2019 - 2024. All rights reserved.