有人用Laravel实现过限制用户重复登录的没?就是后一个登录的用户会将之前登录的用户踢掉

有人用Laravel实现过限制用户重复登录的没?就是后一个登录的用户会将之前登录的用户踢掉,就像那些视频网站里面常做的,不允许一个VIP账号,被多个人同时登录。

在网上查到的都是用纯PHP,在数据库写Session的方式来做,不知道Laravel有没有更方便的做法?

JellyBool

这个我最近在考虑,看看过两天能不能实现,到时在这里更新一下。

CHEN Fengyu 回复 JellyBool

好的,非常期待

JellyBool 回复 CHEN Fengyu

大概最简单的用 session 实现了一下:

**注意此方法需要你的 users 表多加一个字段,比如是 last_session_id **,思路是,每次用户登录进来的时候,就记录用户的 session 值,具体的代码大概是这个样子:

public function login() {
        // User Login Here , Auth::attemp()
        $newSessionId = session()->getId();
        $lastSessionId = session()->getHandler()->read($user->last_session_id);

        if (strlen($lastSessionId) > 0) {
            session()->getHandler()->destroy($user->last_session_id));
         }

        $user->last_session_id = $newSessionId;
        $user->save();
    }
CHEN Fengyu 回复 JellyBool

非常感谢,已经可以跑了,

Auth\AuthController.php
private function authenticated(Request $request, $user)方法中加了这部分代码,

不过在加字段的时候需要规定一个默认值,不然用户第一次登录时,session()->getHandler()->read('')会报错,
$table->string(‘last_session_id’)->default(‘0000000000000000000000000000000000000000’);

beaplat-61f 回复 JellyBool

我还想买视频让小伙伴一起看哈哈

JellyBool 回复 beaplat-61f

这个是不允许的啊

Lange0314

赞同楼上的答案,用一个session_id,存储在数据表是最简单的

beaplat-61f

之前有过这样的业务需求,我们是给APP提供API,要求一个账号在一台手机登录,会把其他手机登录的挤下线,当时是这样实现的,用的redis
登录的时候redis set一条数据,key为几位随机数的token,value为json格式的用户信息(也可以用序列化,真要纠结的话可以网上搜一下两者的性能比较),然后返回给客户端,并且存到数据库里(表示最后一次登录的token)
每次API的请求客户端都携带token这个header上来,先判断redis里有没有这个token,再做处理
那再次登录的时候就删掉表里的token字段的token,这样之前登录的,去请求API就提示请再次登录

说的有点啰嗦,理解思路就好

CracKerMe

但是 好像没有解决 前一个账号的 掉线问题啊

rainwsy

用redis的kv来按user_id存储session可以完美解决