6

我想在应用中显示当前登录用户的列表。我想使用 Laravel Auth 方法。我正在查看 API,但找不到类似的东西。

我可能需要遍历会话存储,然后将其与用户 ID 匹配。我对吗?

更新:忘了提,我将会话存储在数据库中。

4

3 回答 3

26

“当前登录”是普通旧会话无法做到的。让我解释一下原因:

会话是存储在服务器端的一堆数据,通过 cookie 分配给用户。该 cookie 保留在用户浏览器上,因此它使会话保持活动状态。会话可以在用户甚至不登录的情况下保持“活动”数月。

但是,可以将会话存储在数据库上

如您所见,Laravel 保留了一个名为的字段last_activity,并且通过该字段,您应该能够检索在过去 15 分钟内有活动的所有会话(或者其他什么,您称之为)。

当您检索这些记录时,该data字段是会话数据的序列化表示。您可以unserialize($session_record->data)检索用户 ID。

根据您的身份验证驱动程序,会话的用户 ID 可能有不同的名称:

  • 对于雄辩的司机来说,应该是eloquent_login
  • 对于流利的司机fluent_login
  • 对于你的Custom\AuthClass,它应该被调用custom_authclass_login
于 2013-03-26T12:11:21.897 回答
0

假设所有来自登录用户的 http 请求都通过auth中间件,我们可以重写terminate如下函数:

public function terminate($request, $response)
{
    Auth::user()->save();
}

然后像这样的查询User::where('updated_at', '>', Carbon::now()->subMinutes(12))->get();将带来所有已登录的用户,12会话的生命周期在哪里。

当然,对于实时,我们应该ajax每 5 秒使用一次调用或 websockets viapusher或其他。

于 2018-10-28T16:09:00.817 回答
-2

首先创建一个表,其中将插入登录用户的 id

Schema::create('active_users', function(Blueprint $table)

{

                    $table->increments('id')->unsigned();
                    $table->integer('user_id')->unsigned();
                    $table->foreign('user_id')->references('id')->on('users')
                        ->onUpdate('cascade')->onDelete('cascade');

                    $table->timestamps();
        });

然后在您的控制器中在登录时插入数据

if (Auth::attempt($credentials)) {

                  DB::table('active_users')->insert(array('user_id' =>   Auth::id()));
}

并在注销时删除数据

DB::table('active_users')->where('user_id', '=', Auth::id())->delete();

打印视图中的在线用户列表

<ul><strong>Online Users</strong>
            <?php $online_users = DB::table('active_users')->where('user_id','!=',Auth::id())->get(); ?>

            @foreach($online_users as $online_user)
                <li>{{User::find($online_user->user_id)->first_name}}</li>
            @endforeach
        </ul>
于 2015-06-08T11:30:40.620 回答