使用Laravel 5

时间:2016-03-07 17:31:59

标签: laravel authentication controller laravel-5

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

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

我这样做的方法是在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()

但是,这无法确定其他用户是否已登录

4 个答案:

答案 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... 
}