问题描述
我正在开发一个 Web 应用程序,其中的身份验证将在 php 之外针对每个单独的请求完成。我本来打算完全不使用会话,但安全组件正在使用它。
此外,用户对象本身不是 Doctrine 实体,但它具有一个属性,即实体。这会导致问题,因为当用户从会话中反序列化时,该属性的值是一个分离的代理,使其无法使用。
如果框架只为每个请求调用我的用户提供程序,而根本不使用会话(这也让我不必担心会话劫持),我会很高兴,但从文档中没有似乎是这样的选择。
如果这不可能,在反序列化时重新附加代理实体是否可行?用户类 serialize
方法没有用,因为实体管理器在那里不可用。有我可以订阅/收听的活动吗?
附言我正在使用捆绑授权功能,我不想禁用整个捆绑。
解决方法
是的,您可以禁用会话。
在安全组件配置的 firewalls
中的 security.yaml
选项下,您可以为需要无状态的防火墙添加 stateless: true
。
更多关于这里的信息:https://symfony.com/doc/4.4/security/guard_authentication.html
您可以完全禁用会话,将此添加到 framework.yaml
# config/packages/framework.yaml
session:
enabled: true
更多关于会话的信息:https://symfony.com/doc/current/session.html#configuration
如果您反序列化 User 对象并获得分离的代理类,您可以尝试在您的 UserProvider 中$entityManager->refresh($object)
它 - 这应该是一个服务吗?或者甚至尝试再次获取,假设您有它的 ID?