检查是否";其他";用户使用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();
});
}