当我以role_user身份登录我的网站时,当我尝试编辑我的个人资料时,我尝试将我的登录信息更改为我的数据库中的登录信息,我看到错误 - “此登录已被使用”,好的,但是当我刷新我的页面我看到我授权作为新登录,它不是很好
我有这个表单构建器:
namespace User\WalletBundle\Form;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class EditForm extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('username', null, array('attr' => array('placeholder' => 'Login')));
$builder->add('email', 'email', array('attr' => array('placeholder' => 'E-mail')));
$builder->add('mobile', 'number', array('attr' => array('placeholder' => 'Mobile','maxlength' => 10)));
$builder->add('password', 'repeated', array(
'type' => 'password',
'invalid_message' => 'Пароли не совпадают',
'options' => array('label'=>'','required' => false, 'always_empty' => false)));
$builder->add('old_pass','password',array('attr' => array('placeholder' => 'Old pass')));
}
public function getName() {
return 'edit_form';
}
public function getDefaultOptions(array $options) {
return array(
'data_class' => 'User\WalletBundle\Entity\User',
);
}
}
我想我不知道这个系统是如何工作的(安全性),也许我可以阅读有关我的问题,请带一个链接。非常感谢
非常非常抱歉我的英文
在我的控制器中,为了测试,我写了这段代码
/**
* @Secure(roles="ROLE_USER")
* @Template("UserWalletBundle:Wallet:settings.html.twig")
*/
public function settingsAction(Request $request) {
$user_edit = $this->getDoctrine()->getRepository('UserWalletBundle:User')->findOneById($this->get('security.context')->getToken()->getUser()->getId());
$form = $this->createForm(new EditForm(), $user_edit);
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
// Now i have login Alice, and i want change my profile, set login Test, but Test is created some user in DB, ofcours i see error This login is already used
if ($form->isValid()) {
//Do anything
} else {
// There i see error This login is already used
return array('form' => $form->createView());
}
} else
return array('form' => $form->createView());
}
现在我刷新我的页面,我看到我授权为用户名(登录)“测试”,为什么以及如何解决这个问题?
答案 0 :(得分:0)
当您在第
行的反向用户实体时$user_edit = $this->getDoctrine()->getRepository('UserWalletBundle:User')->findOneById($this->get('security.context')->getToken()->getUser()->getId());
您将获得当前授权的用户实体。
因此,要编辑您的个人资料,您应该使用另一个User类。 它应包含您要编辑的字段。它应该用于工作形式。在成功表单验证和entityManager flush之后,您应该更改当前授权用户的字段。
我会试着解释一下,为什么你的问题会发生。但我的英语也不好。
我希望你知道,在php中传递并通过引用返回对象。
Doctrine实现IdentityMap模式。不久,当您尝试从DB获取一些数据时,Doctrine将检索到的数据放入特殊数组中。即如果从DB检索用户,它将被添加到此特殊数组中。因此,当您尝试再次获取它时,将不会向DB请求,但将返回数组中的数据。
因此,当您登录时,doctrine从DB检索用户(用于授权),将其放入数组中。 Symfony的@ security.context服务也使用User的这个实例。现在,在settingsAction中,您尝试再次获取User,并且doctrine从数组返回它。绑定请求后,用户模型已更改(在您的情况下登录字段已更改),Symfony的@ security.context也“知道”这些更改。即使表单无效,帖子数据也会映射到您的用户。这就是为什么你在刷新页面后看到新登录的原因。如果您注销并再次登录,您将看到“旧”登录,因为绑定后没有刷新到DB。
我希望这会对你有所帮助。
P.S。我可以用俄语更好地解释:)