2014-06-18 2 views
0

Я хотел бы создать свой собственный набор для входа в symfony 2.5. Я не хочу использовать FOSUserBundle, потому что мой набор для входа будет работать с другой логикой. Моя логика:Symfony: вход в систему без имени пользователя (ограничения интерфейса)?

  1. Пользователь может иметь несколько электронных писем, но только на первичных электронных письмах. Электронные письма будут перечислены в другом объекте (UserEmail). Внешний ключ будет ссылаться на идентификатор первичной электронной почты
  2. Пользователь должен не иметь имя пользователя или что-то еще, чтобы войти в систему, он может просто использовать адрес электронной почты тех, кто ссылается на свою учетную запись (в UserEmail)
  3. Другой объект, называемый UserRole, будет иметь внешний ключ для UserEntity с его ролью.

Я уже создал все свои сущности: User, UserEmail и UserRole. Поэтому я пытаюсь реализовать свой SecurityController. Но, к сожалению, есть некоторые ограничения, которые я нашел в документации:

Для того, чтобы использовать экземпляр AcmeUserBundle: класс пользователя в слое безопасности Symfony, класс сущности должен реализовывать пользовательского интерфейса. Этот интерфейс вынуждает класс реализовать пять следующие методы

  1. getRoles()
  2. getPassword()
  3. getSalt()
  4. getUsername()
  5. eraseCredential()

Таким образом, мой логин не будет включать в себя пункт 4 getUsername(), потому что у пользователя не будет имени пользователя.

Как я могу реализовать свой логин пользователя без имени пользователя?

+0

Не можете использовать электронную почту в качестве имени пользователя? –

+0

Я не думаю, что это хорошая идея. это совершенно путано назвать его имя пользователя в исходном коде, но означает электронную почту. – user3631654

+0

Но вы сказали, что у вас нет имени пользователя. –

ответ

0

Не можете ли вы реализовать метод getUsername(), чтобы вернуть идентификатор пользователя? Таким образом вы можете использовать UserInterface.

public function getUsername() 
{ 
    return $this->getId(); 
} 

У меня такая же проблема, как и вы. Все мои пользователи просто нуждаются в одном письме и пароле для подключения, я не использую ни одного имени пользователя. Но мне пришлось реализовать все пользовательские интерфейсы для обработки соединения Symfony, и я использовал вышеупомянутое решение.

Это заблуждение, конечно, в моем коде у меня есть, например

public function loadByUsername($username) 
{ 
    findBy(array('email' => $username)); 
    .... 
} 

Но я думаю, что это единственное решение прямо сейчас.

+0

Где Symfony использует метод getUsername()? Может быть, это вызовет проблемы – user3631654

+0

Мне отвратительно использовать что-то, что не было сделано для него. Но если нет другого пути, я должен принять его. Это сделает мой код трудно понять, но все в порядке. – user3631654

+0

Я не знаю другого пути, но я могу ошибаться. Symfony будет использовать метод getUsername для отображения, например, текущему зарегистрированному пользователю в профилировщике. Но я знаю, что когда я делаю $ this-> getUser() в своих контроллерах, я получаю нужного пользователя. – AlixB

0

если у вас есть EMAILS лицо, то оно должно быть связано с Пользовательским Entity отношение один ко многим из стороны пользователя, так что вы можете должны иметь поле в User лица, которые держат массив электронной почты лица если GetUserName() функции вы можете перебрать все письма и вернуть любой из них, что вы хотите

function getUserName(){ 
    // $Email is an array it will hold the array of email entity 
    // as it is in one to many relationship with User Entity 

    foreach($Emails as $email){ // loop through each email 
    if($email->your_flag_to_identify_primery_username==true){ 
    return $email->email_address; // return that match according to flag set by you 

    } 

дальше вы должны написать механизм пользовательских аутентификации этот link будет полезным для вас

0

GetUserName() не всегда используя username в качестве имя_поль. Может быть, вы можете принять это как пример, это показывает, как использовать email как имя поля:

public function getUsername() 
{ 
    return $this->email; 
} 

public function getRoles() 
{ 
    return array('ROLE_ADMIN'); 
} 

public function eraseCredentials() 
{ 
} 

public function serialize() 
{ 
    return serialize(array(
     $this->id, 
     $this->email, 
     $this->password, 
     // see section on salt below 
     // $this->salt, 
    )); 
} 

public function unserialize($serialized) 
{ 
    list (
     $this->id, 
     $this->email, 
     $this->password, 
     // see section on salt below 
     // $this->salt 
    ) = unserialize($serialized); 
} 

Вы можете также с помощью массива в качестве имени пользователя, дайте мне знать, если вы используете массив в качестве коллекции вашей электронной почты.

ПРИМЕЧАНИЕ: Вы все еще можете использовать getEmail() для возврата электронной почты в свой объект. Вы можете создать более одного имени функции, чтобы вернуть одно и то же поле в свой объект. ;)

0

Почему бы не использовать ID в качестве имени пользователя? Это обеспечивает больше логики в вашей концепции: идентификатор уникален, никогда не изменится в течение времени, если вы не измените его вручную. При необходимости вы можете указать основной адрес электронной почты или список адресов для своего пользователя. Если вы хотите узнать своего пользователя по любому уникальному свойству, это то, к чему должен использоваться идентификатор (только это, поскольку уникальные идентификаторы работают в мире баз данных - это почти тот же вариант использования).

Пример объекта добытчика:

class User { 
    ... 

    public function getUsername() 
    { 
     return $this->id; 
    } 

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