2016-10-17 2 views
0

i'am с использованием Symfony 2.8 и Учение и я security.yml настроен, чтобы указать на пользователя класса, который реализует пользовательским интерфейсом. Моя схема ORM находится в YAML.Symfony - авторизованный пользователь не все поля заполнены

Проблема: - В базе данных пользователь также указал поле «email», Symfony для LOGGED USER не заполняет это поле, а поле «пароль» пуст.

screenshot

Когда я $this->get('doctrine.orm.entity_manager')->clear(User::class); то менеджер объект правильно выборки объект. Но когда объект отправляется с СЕССИИ, это неверно.

Проблема также, что, когда я пытаюсь принести свежий объект из базы данных с помощью функции поиска() на хранилище, то, неправильный элемент из сессии извлекается, когда я не буду использовать $em->clear(User::class)

Вопрос: - Как сказать Symfony/Doctrine, чтобы построить мою сущность таким образом, что у нее будут заполнены все поля, чтобы она стала устойчивой?

<?php 

namespace XXX\AppBundle\Model\Entity; 

use XXX\AppBundle\Model\Entity\Server\Logging; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Security\Core\User\UserInterface; 

/** 
* User 
*/ 
class User implements UserInterface 
{ 
    /** 
    * @var integer $id 
    */ 
    protected $id; 

    /** 
    * @var string $username 
    */ 
    protected $username; 

    /** 
    * @var string $email 
    */ 
    protected $email; 

    /** 
    * @var string $password 
    */ 
    protected $password; 

    /** 
    * @var array $roles 
    */ 
    protected $roles = array(); 

    /** 
    * @var \Doctrine\Common\Collections\Collection $logEvents 
    */ 
    protected $logEvents; 

    /** 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getUsername() 
    { 
     return $this->username; 
    } 

    /** 
    * @param string $username 
    * @return $this 
    */ 
    public function setUsername($username) 
    { 
     $this->username = $username; 
     return $this; 
    } 

    /** 
    * @return string 
    */ 
    public function getEmail() 
    { 
     return $this->email; 
    } 

    /** 
    * @param string $email 
    * @return $this 
    */ 
    public function setEmail($email) 
    { 
     $this->email = $email; 
     return $this; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getPassword() 
    { 
     return $this->password; 
    } 

    /** 
    * @param string $password 
    * @return $this 
    */ 
    public function setPassword($password) 
    { 
     $this->password = $password; 
     return $this; 
    } 

    /** 
    * Returns the roles or permissions granted to the user for security. 
    */ 
    public function getRoles() 
    { 
     $roles = $this->roles; 

     // guarantees that a user always has at least one role for security 
     if (empty($roles)) { 
      $roles[] = 'ROLE_USER'; 
     } 

     return array_unique($roles); 
    } 

    public function setRoles(array $roles) 
    { 
     $this->roles = $roles; 
    } 

    /** 
    * Returns the salt that was originally used to encode the password. 
    */ 
    public function getSalt() 
    { 
     // See "Do you need to use a Salt?" at http://symfony.com/doc/current/cookbook/security/entity_provider.html 
     // we're using bcrypt in security.yml to encode the password, so 
     // the salt value is built-in and you don't have to generate one 

     return; 
    } 

    /** 
    * Removes sensitive data from the user. 
    */ 
    public function eraseCredentials() 
    { 
     $this->password = null; 
     $this->email = null; 
    } 

    /** 
    * Appends an entry to administration log 
    * 
    * @param \XXX\AppBundle\Model\Entity\Server\Logging $logEvent 
    * @return $this 
    */ 
    public function appendLog(Server\Logging $logEvent) 
    { 
     if (!$this->logEvents->contains($logEvent)) 
     { 
      $this->logEvents->add($logEvent); 
     } 

     return $this; 
    } 

    /** 
    * Remove a log entry from the history 
    * 
    * @param \XXX\AppBundle\Model\Entity\Server\Logging $logEvent 
    * @return $this 
    */ 
    public function clearLogEntry(Server\Logging $logEvent) 
    { 
     $this->logEvents->removeElement($logEvent); 

     return $this; 
    } 
} 

И ORM конфигурация:

XXX\AppBundle\Model\Entity\User: 
    type: entity 
    table: users 
    repositoryClass: XXX\AppBundle\Model\Repository\UserRepository 
    id: 
     id: 
      type: integer 
      scale: 0 
      length: null 
      unique: false 
      nullable: false 
      precision: 0 
      id: true 
      generator: 
       strategy: IDENTITY 
    fields: 
     username: 
      type: string 
      scale: 0 
      length: null 
      unique: true 
      nullable: false 
      precision: 0 
     email: 
      type: string 
      scale: 0 
      length: null 
      unique: true 
      nullable: false 
      precision: 0 
     password: 
      type: string 
      scale: 0 
      length: null 
      unique: false 
      nullable: false 
      precision: 0 
     roles: 
      type: json_array 
      scale: 0 
      length: null 
      unique: false 
      nullable: false 
      precision: 0 
    oneToMany: 
     logEvents: 
      targetEntity: XXX\AppBundle\Model\Entity\Server\Logging 
      cascade: 
       - remove 
       - persist 
      fetch: LAZY 
      mappedBy: author 
      inversedBy: null 
      orphanRemoval: false 
      orderBy: null 
    lifecycleCallbacks: { } 

Спасибо за ваше время. великого день :-)

+0

Как вы извлекаете пользователя из сеанса, каков код в вашем классе User? – Gerry

+0

Да, я извлекаю пользователя из сеанса. В классе пользователя я только что защитил частные свойства + getters. И файл yml ORM выглядит обычно как в других объектах. –

+0

Пожалуйста, отправьте код. – Gerry

ответ

1

Вы реализовали :: eraseCredentials пользовательского интерфейса() метод таким образом, что он сбрасывает адрес электронной почты и пароль:

public function eraseCredentials() 
{ 
    $this->password = null; 
    $this->email = null; 
} 

Symfony будет вызывать этот метод до сериализации объекта чтобы сохранить его в сеансе.

UserInterface :: eraseCredentials() предназначен для удаления конфиденциальных данных из пользовательского объекта, поэтому он не заканчивается, например, файлами сеанса, но нет реальной необходимости удалять электронную почту, например, вы делаете. Лучшим примером может быть, если вы храните версию открытого пароля пользователя на этом объекте, это то, что вы никогда не захотите в конечном итоге в файлах сеансов.

+0

Спасибо. Я не удаляю имя пользователя, а просто пароль и адрес электронной почты :) –

+0

Как реализовать изменение пароля или список ролей при удалении электронной почты или пароля? –

+0

Правильно, но по этой причине электронная почта отсутствует при извлечении из сеанса. – Gerry

Смежные вопросы