我们实现了AdvancedUserInterface
来管理用户身份验证,但是由于某种原因,Symfony安全性序列化了整个User
实体,而不仅仅是最少的必需字段(例如:id
、username
、password
)。
根据文档,我们需要指定应该序列化的确切字段(然后忽略其余字段)。
class User implements AdvancedUserInterface, \Serializable {
/**
* @see \Serializable::serialize()
*/
public function serialize()
{
return serialize(array(
$this->id,
$this->username,
$this->password
));
}
}
但是,尽管我们这样做,Symfony安全忽略了这个serialize()
方法,仍然序列化整个实体。这会中断登录,因为对象变得太大而无法序列化和存储。
4条答案
按热度按时间qxsslcnc1#
下面是它在Symfony 5.4和更高版本的www.example.com中如何工作的解释https://symfony.com/doc/5.4/security.html#understanding-how-users-are-refreshed-from-the-session。然而,他们提到了
SerializableInterface
,没有任何参考,很难找到任何关于它的东西。这样的接口不存在(PhpStorm无法找到它)。我猜他们可能是指https://www.php.net/manual/en/class.serializable.php。我通过在我的
User
实体中实现\Serializable
接口解决了这个问题,如下所示:我不再保存不需要的关系或数据。现在会议规模很小。我还注意到响应时间显著减少=登录用户的页面加载速度更快,特别是管理员。
xj3cbfub2#
显然,Symfony安全使用
Symfony\Component\Security\Core\Authentication\Token\AbstractToken
,这有一个自定义的序列化方法,可以将更多的数据添加到会话序列化的User中。这会将
role
添加到序列化对象。但是我们有一个自定义的角色系统,它与其他实体(例如Site
),这会在序列化User
时导致致命的膨胀。5sxhfpxr3#
我意识到这是一个老问题,但我使用Symfony序列化器解决了一个类似的问题。你可以在这里读到更多。
对组进行编码的函数如下所示:
一个简单的实体示例如下:
以及Type实体:
您可以根据需要将其扩展到任意多个实体,或创建新的组。现在使用函数:
在使用groups之前,我尝试了MaxDepth注解,但它似乎有some problems。
rkue9o1l4#
https://symfony.com/doc/7.0/session.html#mariadb-mysql上的文档指出,对于
sess_data
列,我们可以使用MEDIUMBLOB
而不是默认的BLOB
。BLOB列类型(默认情况下由createTable()使用)最多存储64 kb。如果用户会话数据超过此值,则可能会引发异常,或者会以静默方式重置他们的会话。如果需要更多空间,请考虑使用MEDIUMBLOB。
您可以通过编写迁移来实现这一点(有关迁移,请参见https://symfony.com/doc/current/doctrine.html)。