我正在尝试创建应用程序,其中用户可以通过多个社交服务登录,有些是 OAuth,有些是 OpenID,我的 User 实体不需要用户名字段或密码,但 UserInterface 要求我实现用户名和密码的 getter(以及盐)。
我所做的是在 getUsername 中返回用户 id,在 getPassword 和 getSalt 中返回 null。
我的安全性配置为使用 form_login,但我只提供 /login 路由,因此未经身份验证的用户将被重定向到一个页面,他们可以在其中找到各种登录选项。
我没有提供 check_login 的路线。
我将使用代码以编程方式对用户进行身份验证:
$token = new UsernamePasswordToken($user, null, "main", $user->getRoles());
$this->get("security.token_storage")->setToken($token);
Run Code Online (Sandbox Code Playgroud)
我的问题是,返回空密码并且未设置 check_login 是否安全?我的目标是不让用户使用表单登录。因此他们不会使用空密码登录。我已经检查了到目前为止我所做的所有工作,但我想确保它不会让用户使用空密码登录其他用户。
TL;DR:我正在寻找部分或完全禁用 Doctrine 缓存的方法。
我试图从数据库中获取新数据,首先我不知道 Doctrine 是否有某种缓存,它是如何工作的,它不会从数据库中获取数据两次。
(它可能比这更复杂,但是我如何理解它以及它如何对我起作用,我不是在这里解释它是如何工作的,我来这里是因为我对这种学说机制有疑问。)
例如,假设我有代码(我在 Symfony 下工作):
$em = $this->getDoctrine()->getManager();
$repo = $this-getRepository('AppBundle:User');
$user = $repo->getUserById(1);
echo $user->getName(); // It will print "User"
sleep(5); // I give myself some time to change user name to anything else than "User"
$sameUser = $repo->getUserById(1);
echo $sameUser->getName(); // It still prints out "User"
Run Code Online (Sandbox Code Playgroud)
现在要解决这个问题,我必须使用$em->detach($user)并且只有在 $sameUser 包含从数据库获取的 fersh 数据之后。我对useResultCache和useQueryCache抱有希望,我尝试在构建的查询上将它们设置为 false,但这没有帮助。部分禁用单个查询的缓存将是完美的。
但假设我有实体 A引用其实例之一,因此例如userA具有通过 Referer 字段指向userB 的字段。
当我分离userB以从数据库而不是从缓存中新鲜获取它时,我会得到我想要的东西,但是如果我在分离userB …