php - 如何避免 symfony 4 中的多个用户会话?
问题描述
如何防止注册用户从多个设备访问网站?
我在 EventListener 中创建了一个 onSecurityInteractiveLogin 函数
<?php
namespace App\EventListener;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
class LoginListener
{
public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$user = $event->getAuthenticationToken()->getUser();
$session = $event->getRequest()->getSession();
//TODO validate if that user is logged in
}
}
但是如果用户登录其他设备并关闭该会话,我无法获得,我找到了一个解决方案,但在这里的 Symfony 2.3 中。
任何人都可以向我解释 Symfony 4 中的解决方案吗?
解决方案
简短的回答是你不能。
更长的答案更复杂:您的网站无法知道哪些设备属于匿名用户;从服务器的角度来看,所有请求看起来都像是来自随机位置(它们是)。
但是,一旦用户登录,您就可以实施更多限制。诀窍在于如何发布身份验证令牌以及如何将它们与应用程序中的用户记录相关联。有很多方法可以给猫剥皮,但它们都涉及跟踪已授予用户帐户的身份验证次数。通常,身份验证请求会使用用户的 IP 和浏览器中的用户代理字符串进行跟踪,以帮助区分用户的登录名和另一个登录名。例如,当您登录 GMail 时,您可以查看所有访问过该帐户的登录信息——这可以帮助您识别欺诈登录,但它也可以显示您使用了多少设备(或浏览器)登录。
推荐阅读
- python - 预期输入 batch_size (1) 与目标 batch_size (10) 匹配
- c# - 是否可以将 TimeSpan.TryParseExact 用于数百分钟的时间(格式〜“mmm:ss”)?
- ios - Ionic 3 - 应用程序卡在启动画面上。在我进行更改并在模拟时刷新后开始运行(iOS)
- node.js - Https createServer,加载cookie和加载客户端index.html
- android - android安装失败-“cmd:找不到服务:包”(不是模拟器)
- c# - 如何解释 IEnumerable.Where() 子句的这种难以理解的结果?
- javascript - 使用 HREF 标记在折叠菜单内导航
- php - 仅当您登录 Laravel 时才创建工作
- javascript - 当参数是javascript中字符串和数组(对象)的组合时,如何构建函数?
- asp.net-mvc - 如何使用 Linq 过滤列表内的列表?