Laravel 单设备登录

https://laravel-china.org/articles/10605/laravel-single-device-login

前几天在 laracasts 看了laravel5.6的新功能视频 logoutOtherDevices 用于使在其他设备上处于活动状态的用户会话无效并“注销”,而不会使其当前设备上的会话无效。,今天抽空把它应用到了系统里,在这里记录下吧。
在使用此功能前需要先把 app/Http/Kernel.php web 中间件中的 \Illuminate\Session\Middleware\AuthenticateSession::class 注释取消掉。

LoginController 控制器中继承 Illuminate\Foundation\Auth\AuthenticatesUsers 类中的 authenticated 方法。

protected function authenticated(Request $request, $user)
{
    $this->guard()->logoutOtherDevices($request->password);
    return response()->json(['message' => '登录成功']);
}

logoutOtherDevices 接受两个参数,第一个参数是来自表单提交的数据,然后经过加密保存到第二个参数指定的字段里,在经过中间件储存 session

public function logoutOtherDevices($password, $attribute = 'password')
{
    if (! $this->user()) {
        return;
    }

    return tap($this->user()->forceFill([
        $attribute => Hash::make($password),
    ]))->save();
}
}

 

 

这样在用户登录成功后,即会注销其他设备上的会话而实现单设备登陆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Laravel 中,可以使用 Redis 存储用户登录 token,以实现个用户登录。以下是实现步骤: 1. 安装 Redis 服务器和 Redis 扩展。 2. 在 config/auth.php 配置文件中,将默认的 guard 驱动器设置为 `redis`,如下所示: ```php 'defaults' => [ 'guard' => 'redis', ... ], ``` 3. 在 config/auth.php 配置文件中,添加一个新的 guard 驱动器,并将其设置为使用 Redis 存储: ```php 'guards' => [ 'redis' => [ 'driver' => 'session', 'provider' => 'users', 'lifetime' => 120, // token 过期时间,位为分钟 'redis_connection' => 'default', // Redis 连接名 ], ... ], ``` 4. 在 config/session.php 配置文件中,将驱动器设置为 `redis`,如下所示: ```php 'driver' => env('SESSION_DRIVER', 'redis'), ``` 5. 创建一个中间件,用于检查用户是否已经登录,如果已经登录,则禁止用户登录。可以使用如下代码: ```php namespace App\Http\Middleware; use Closure; use Illuminate\Auth\AuthenticationException; use Illuminate\Contracts\Auth\Factory as AuthFactory; class EnsureSingleUserLogin { protected $auth; protected $redis; public function __construct(AuthFactory $auth) { $this->auth = $auth; $this->redis = app('redis')->connection('default'); } public function handle($request, Closure $next) { $user = $this->auth->guard()->user(); if ($user) { $key = "user:{$user->id}:token"; $token = $this->redis->get($key); if ($token !== $request->session()->getId()) { throw new AuthenticationException('已在其他设备登录'); } } return $next($request); } } ``` 6. 在路由中使用中间件来检查用户是否已经登录,如果已经登录,则禁止用户登录。可以使用如下代码: ```php Route::middleware(['auth', 'single.user.login'])->group(function () { // ... }); ``` 通过以上步骤,就可以使用 Redis 存储用户登录 token,以实现个用户登录

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxw1844912514

你的打赏就是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值