0

当我以 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());
    }

现在我刷新我的页面,我看到我授权为用户名(登录)“测试”,为什么以及如何解决这个问题?

4

1 回答 1

0

当您在线检索用户实体时

$user_edit = $this->getDoctrine()->getRepository('UserWalletBundle:User')->findOneById($this->get('security.context')->getToken()->getUser()->getId());

您将获得当前的授权用户实体。

因此,要编辑您的个人资料,您应该使用另一个 User 类。它应该包含您正在编辑的字段。它应该用于与表单一起工作。在成功表单验证和 entityManager 刷新后,您应该更改当前授权用户的字段。

我会试着解释一下,为什么会出现你的问题。但是我的英语也不好。

我希望你知道,在 php 中通过引用传递和返回对象。

Doctrine 实现了 IdentityMap 模式。很快,当您尝试从 DB 中获取一些数据时,Doctrine 会将检索到的数据放入特殊数组中。即,如果您从数据库中检索用户,它将被添加到这个特殊数组中。因此,当您再次尝试获取它时,将不会向 DB 请求,但会返回数组中的数据。

因此,当您登录时,学说从数据库中检索到的用户(用于授权)蚂蚁将其放入数组中。Symfony 的@security.context 服务也使用这个用户实例。现在,在 settingsAction 中,您尝试再次获取 User 并且教义从数组中返回它。在绑定请求之后,用户模型发生了变化(在您的情况下登录字段发生了变化),并且 Symfony 的 @security.context 也“知道”这些变化。即使表单无效,发布数据也已映射到您的用户。这就是页面刷新后您会看到新登录的原因。如果您注销并再次登录,您将看到您的“旧”登录,因为绑定后没有刷新到 DB。

我希望这会对你有所帮助。

ps 我可以用俄语更好地解释它:)

于 2013-05-28T18:29:01.067 回答