如果用户同时设置为非活动状态,则会使会话无效 - Symfony2

时间:2016-04-27 15:13:16

标签: php symfony session

Symfony - 2.8.4 FOSRestBundle

基于会话的登录系统存在问题。我的用户类实现了AdvancedUserInterface\Serializable,它看起来像这样:

/** @see \Serializable::serialize() */
public function serialize()
{
    return serialize([
        $this->id,
        $this->username,
        $this->password,
        $this->isActive,
    ]);
}

/** @see \Serializable::unserialize() */
public function unserialize($serialized)
{
    list (
        $this->id,
        $this->username,
        $this->password,
        $this->isActive,
        ) = unserialize($serialized);
}
...
public function isEnabled()
{
    return $this->isActive;
}

因此有一个属性isActive负责检查用户是否可以访问应用程序。当用户想要登录时,这一切都正常工作,但问题是用户是否已登录到应用程序而其他人将其设置为非活动状态。用户仍然可以对API进行ajax调用。来自symfony doc:

  

用户登录后,整个用户对象将被序列化   会议。在下一个请求中,反序列化User对象。   然后,id属性的值用于重新查询新鲜   来自数据库的用户对象。最后,新的User对象是   与反序列化的User对象相比,以确保它们   代表同一个用户。例如,如果用户名为2   由于某种原因,对象不匹配,然后将记录用户   出于安全原因。

即使我调试了该代码,来自会话的用户也有inActive:1,而来自DB的值为0,它会转到$changed = true

/**
 * Sets the user in the token.
 *
 * The user can be a UserInterface instance, or an object implementing
 * a __toString method or the username as a regular string.
 *
 * @param string|object $user The user
 *
 * @throws \InvalidArgumentException
 */
public function setUser($user)
{
    if (!($user instanceof UserInterface || (is_object($user) && method_exists($user, '__toString')) || is_string($user))) {
        throw new \InvalidArgumentException('$user must be an instanceof UserInterface, an object implementing a __toString method, or a primitive string.');
    }

    if (null === $this->user) {
        $changed = false;
    } elseif ($this->user instanceof UserInterface) {
        if (!$user instanceof UserInterface) {
            $changed = true;
        } else {
            $changed = $this->hasUserChanged($user);
        }
    } elseif ($user instanceof UserInterface) {
        $changed = true;
    } else {
        $changed = (string) $this->user !== (string) $user;
    }

    if ($changed) {
        $this->setAuthenticated(false); //GOES HERE !!!
    }

    $this->user = $user;
}

之后回复通常就像用户登录一样。但之前引用的文档说会破坏该会话并且用户将被注销:(

这是一个错误吗?有没有人有同样的问题

提前致谢

0 个答案:

没有答案