检查是否";其他";用户使用Laravel 5登录/注销

检查是否";其他";用户使用Laravel 5登录/注销,laravel,authentication,controller,laravel-5,Laravel,Authentication,Controller,Laravel 5,我正在创建一个类似于聊天应用程序的应用程序 我希望能够确定用户是否登录 我这样做的方式是在users表中有一个is\u logged\u字段 但是我不确定如何更新这个变量,因为我不知道在注销期间调用了什么方法 我想应该是这样的: class AuthController extends Controller { //... public function login($user) { $user->is_logged_in = true;

我正在创建一个类似于聊天应用程序的应用程序

我希望能够确定用户是否登录

我这样做的方式是在
users
表中有一个
is\u logged\u
字段

但是我不确定如何更新这个变量,因为我不知道在
注销期间调用了什么方法

我想应该是这样的:

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()
但是,这无助于确定是否有其他用户登录

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特征。这是从Laravel文档中调用的getLogin()函数

确定当前用户是否经过身份验证

要确定用户是否已登录到您的应用程序,请 可以在Auth facade上使用check方法,如果 用户已通过身份验证:


解决方案1:编辑用户控制器[不推荐]

在仔细检查了
AuthicatesUsers
trait之后,我设法解决了这个问题:

我在
用户
模型中添加了以下方法

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可能不是最好的方式,因为用户可以通过其他方式登录(例如,社交身份验证)

因此,最好使用事件。i、 e.将这些添加到
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();
    });
}

如果您正在尝试创建聊天应用程序,并且希望知道是否有其他用户登录(或者更具体地说,是否可以主动参与聊天),最好使用基于事件的方法,使用Pusher等服务来识别正在收听给定频道的特定用户。数据库从来都不是跟踪用户登录状态的有效场所,因为用户可以简单地关闭浏览器,有效地让他们注销,但数据库不会知道。您可以做一些事情,比如查看用户的最后一个活动,并在每次请求时更新该活动,但是这种类型的方法不会考虑用户长时间处于空闲状态而没有注销,但仍然可以聊天。系统会查看他们上次的行动时间,并认为他们已注销,而他们没有


因此,唯一可靠的方法是打开一个事件广播频道,然后所有其他客户端都可以访问该频道的其他活动“侦听器”。当用户关闭浏览器时,浏览器会关闭他们与频道的连接,然后频道会立即传播到所有其他用户。如果您不知道Laravel内置的这些类型的基于事件的频道功能,我真的建议您观看。在较新版本的Laravel上实现起来更容易,但功能非常强大。

但它无助于确定是否有其他用户登录。我正在创建一个聊天应用程序。我认为这不起作用,因为这些方法甚至都不运行!我把
dd(“hi
)`放在方法的顶部,但它们没有运行!我代码中的示例只是一个示例。我需要一个地方来放置我的代码您是如何使用
Route::get('login','Auth')登录用户的\AuthController@getLogin“)->name('login');
我没有创建一个名为“getLogin”的方法“.它自动做到了!如果(Auth::trunt(['email'=>$email,'password'=>$password,'active'=>1]){//用户处于活动状态,没有挂起,并且存在,请使用此选项登录。}由于我看不到正确的信息,您可以将其放入您的答案中吗?您可以使用Session::set()和Session::get()方法来处理登录。最后可以使用Session::flush()我认为与我的解决方案相比,这是一个糟糕的解决方案,因为身份验证特性中有很多逻辑无法运行。而且,与使用事件相比,它要复杂得多!
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();
    });
}