2012-07-04 2 views
2

У меня возникла проблема с системой безопасности Symfony2, особенно при попытке загрузить роли из базы данных. Прежде чем идти дальше, я знаю FOSUserBundle, но на данный момент, чтобы лучше понять структуру Symfony2, я хочу попробовать и сделать работу с моими пакетами только с использованием компонентов Symfony2. TL; DR -> пожалуйста, не говорите мне просто использовать FOSUserBundle. :-)Symfony2: загрузка пользовательских ролей из базы данных

У меня есть 3 объекта, настроенные в моем пакете, учетные записи, учетные записи и учетные записиRepository.

ЦСИ \ RedK \ Ядро \ IndexBundle \ Entity \ Accounts.php
http://pastebin.com/0VgXvtJp

ЦСИ \ RedK \ Ядро \ IndexBundle \ Entity \ AccountsRoles.php
http://pastebin.com/GiKNnYg3

ЦСИ \ RedK \ Core \ IndexBundle \ Entity \ AccountsRepository.php
http://pastebin.com/SVuMVdpN

MySQL demo_template.accounts Таблица
http://pastebin.com/YzmjD9e4

MySQL demo_template.accounts_roles Таблица
http://pastebin.com/Ybwr4f7y

Все аспекты пачке были правильно работают (регистрация, подтверждение, сброс пароля, и Логин) прежде чем я попытался добавить загрузку пользовательских ролей из базы данных. Когда я просто устанавливаю роль в массив ('ROLE_USER') через getRoles() {return array ('ROLE_USER')}, выполнялась аутентификация и пользователь успешно вошел в систему.

Однако при попытке интегрировать роли из базы данных, я получаю следующее сообщение об ошибке, что я понимаю, является экземпляром AuthenticationException:

Notice: Undefined index: id in /home/humplebert/Websites/www/template/vendor/doctrine/lib/Doctrine/ORM/Query/SqlWalker.php line 804 

Трассировка стека
http://pastebin.com/Sr5RvZaY

за исключением генерируется только при изменении запроса в AccountsRepository и удалении
компонентов «-> select()» и «-> leftJoin()». Посмотрев на Stack Trace, вокруг строки 16 на ссылке pastebin.com, похоже, что у меня есть всевозможные «сумасшедшие», происходящие в отношении сопоставления «многие ко многим» в BasicEntityPersister.

Я искал высоко и низко в своих классах Entity для любой ссылки на простой «id» и не нашел их. Я заметил, что если я изменил имена своих столбцов «ID» в моих сущностях только на «id» (т.е. заменил «AccountsID» на «id» в src \ RedK \ Core \ IndexBundle \ Entity \ Accounts), ошибка (и заменяется другой ошибкой, более подробно об этом в данный момент).

Вопрос 1)
Есть ли что-то blatently неправильно с моим Entities быть генерирование «Undefined индекса: идентификатор» ошибка я получаю? Если нет, то для Symfony2/Doctrine2 требуется, чтобы столбцы Auto-Increment были помечены как «id»?

Как я продолжал возиться, я решил попробовать переименовать столбцы ID таблицы в «id». Следовательно, src \ RedK \ Core \ IndexBundle \ Accounts заменяет AccountsID только «id». Аналогично, src \ RedK \ Core \ IndexBundle \ AccountsRoles заменяет RolesID только «id». При этом ошибка «Undefined index: id» исчезает. Однако, я получаю новую ошибку: "table or view demo_template.accounts_accountsroles does not exist". Ну, конечно, этого не существует, у меня нет таблицы, определяемой как account_accountsroles. У меня есть две таблицы, учетные записи и account_roles.

Вопрос 2)
Для того, чтобы использовать инструменты Symfony2/Doctrine2 для импорта ролей пользователей из базы данных, какие правила существуют в отношении имен таблиц? Основываясь на полученной ошибке, кажется, что происходит какая-то форма конкатенации. Или я просто просто испортил свои аннотации где-то вдоль линии?

Любая помощь была бы принята с благодарностью.

+0

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

+0

Вы должны поместить трассировку стека вместо ошибки (т. Е. Сообщения, файла и строки ...). – AdrienBrault

+0

В большинстве баз данных (включая MySQL) для многих отношений требуется третья таблица «соединения». Если вы не укажете имя этой таблицы в своих аннотациях, Symfony генерирует ее, объединяя имена двух объектов - таким образом, таблица account_accountsroles, которая должна существовать, чтобы ваши отношения многие и многие работали. Может быть просто, что ваша схема базы данных устарела или может возникнуть проблема с вашими многочисленными аннотациями. – redbirdo

ответ

0

Что касается вопроса 1), то короткий ответ - нет! Для длительного ответа смотри раздел 5.3 Сопоставление значения по умолчанию в доктрине Association Mapping документации:

Он утверждает, что если вы используете эту короткую аннотацию:

/** @ManyToMany(targetEntity="Group") */ 
private $groups; 

«В этом случае имя объединения таблиц по умолчанию используется сочетание простых, неквалифицированных имен классов участвующих классов, разделенных символом подчеркивания. Имена столбцов объединения по умолчанию равны простому, неквалифицированному классу имени целевого класса, за которым следует «_id». Обозначенное имя столбца всегда по умолчанию имеет значение «id », Так же, как в сопоставлениях« один-к-одному »или« много-к-одному »».

Вы можете переопределить значения по умолчанию, указав более подробное много-много аннотаций (см. Ссылку выше) и, следовательно, избегайте ошибки id.

Касательно вопроса 2) конкатенация верна. Для многих отношений требуется третья таблица «соединения». В приведенном выше разделе «Доктрина» объясняется, как генерируется имя этой таблицы.

Я не знаю, почему ошибка «таблица ... не существует» возникает для таблицы соединений, так как аннотации выглядят нормально для меня. Кажется, что ваша схема базы данных как-то не синхронизирована с вашими аннотациями.

0

Я реализовал решение, выше FOSUserBundle и описал его here

После осуществления доступа Роль доктрины вы через в еще нужно сделать сервис RoleHierarchy знает об этом.

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