繁体   English   中英

如何限制每个会话只能登录一次用户?

[英]How to restrict user to be logged only one time per session?

我正在使用Symfony 1.4应用程序,因此我需要防止用户多次登录到该应用程序,这意味着如果S / He已经登录,则只能打开一个新帐户就不能登录。浏览器。

  • 用户登录Chrome。
  • 打开Firefox,尝试登录后无法登录,因为会话已在Chrome上激活

我要避免同一用户使用同一台计算机或另一台计算机中的其他浏览器开始另一个会话。

您可以通过以下方式检查用户是否已登录:

sfContext::getInstance()->getUser()->isAuthenticated()

或内部动作只是:

$this->getUser()->isAuthenticated()

所以我想你想拥有这样的东西:

public function executeLogin($request)
{
    if ($this->getUser()->isAuthenticated()) {
        // redirect or whatever
        // $this->redirect(...);
    } else {
        // login user properly
    }
}

我想到的唯一解决方案是在MySQL(或您的数据库)中使用会话,然后检查给定用户的会话是否处于活动状态,以便可以登录或不登录。

这将不是一个容易的部分。 我曾经做过一次,但是找不到源代码。所以我将描述您将要做的事情。

  1. 您需要激活sfPDOSessionStorage以将会话存储在db中( 您可以关注此博客文章
  2. 然后创建一个扩展sfPDOSessionStorage的自定义存储,以便能够在会话表中添加更多字段。

    您将有一个新的领域(例如sess_user_id您的内部) factories.yml ,像这样:

     all: storage: class: myCustomPDOSessionStorage param: db_table: session database: propel db_id_col: sess_id db_data_col: sess_data db_time_col: sess_time db_user_id_col: sess_user_id 
  3. 您需要将自定义会话存储中的方法sessionReadsessionWrite更新为:

    • 使用新字段(user_id)插入/更新
    • 检查user_id是否已经存在,会话时间是否正常。 如果不是,则抛出异常。 用户登录时必须捕获此异常,以显示有关该问题的消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM