2012-04-26 4 views
0

Мне нужно расширить SonataUser, чтобы задать поле с именем isAdmin в true, когда пользователь создается из бэкэнд. У меня разные группы пользователей для ADMIN => (может создавать пользователей admin и выполнять CRUD на других объектах) и STAFF => (может выполнять CRUD на других объектах). Клиенты регистрируются из внешнего интерфейса.Symfony2 SonataAdmin: «Access Denied» Исключение при попытке расширения SonataUserAdmin

Оба backend_users (ПЕРСОНАЛ) и клиенты являются экземплярами объекта пользователя, который проходит SonataUser.


До сих пор я использовал классы по умолчанию для пользователей и групп. Вот как выглядело мое приложение app/config/config.yml

...app/config/config.yml... 
      users: 
       label: Users 
       items: [ sonata.user.admin.user ] 
      groups: 
       label: Groups 
       items: [sonata.user.admin.group] 
... 

Это сработало для меня.

Теперь мне нужно настроить реализацию по умолчанию, так что я скопировал код из Sonata/UserBundle/User/BaseUser.php в <my namespace>/AdminBundle/Admin/BackendUser.php Я создал новую услугу и замэпил в config.yml

...app/config/config.yml... 
      users: 
       label: Users 
       items: [ gd_admin.backend_user ] 
      groups: 
       label: Groups 
       items: [sonata.user.admin.group] 
... 


...GD/AdminBundle/Resources/services.yml... 
parameters: 
    gd_admin.backend_user.class: GD\AdminBundle\Admin\BackendUserAdmin 
.. 
services: 
    gd_admin.backend_user: 
     class: %gd_admin.backend_user.class% 
     tags: 
      - { name: sonata.admin, manager_type: orm, label: Backend User } 
     arguments: [null, GD\AdminBundle\Entity\User, null] 
     # NOTE: No group defined in tags 
... 

Ранее я получил следующие роли моего ADMIN Группа:

 'ROLE_SONATA_USER_ADMIN_USER_EDIT', 
     'ROLE_SONATA_USER_ADMIN_USER_LIST', 
     'ROLE_SONATA_USER_ADMIN_ USER _CREATE', 
     'ROLE_SONATA_USER_ADMIN_ USER _VIEW', 
     'ROLE_SONATA_USER_ADMIN_ USER _DELETE', 
     'ROLE_SONATA_USER_ADMIN_ USER _OPERATOR', 
     'ROLE_SONATA_USER_ADMIN_ USER _MASTER', 
Now they are: 
     'ROLE_GD_ADMIN_BACKEND_USER_EDIT', 
     'ROLE_GD_ADMIN_BACKEND_USER_LIST', 
     'ROLE_GD_ADMIN_BACKEND_USER_CREATE', 
     'ROLE_GD_ADMIN_BACKEND_USER_VIEW', 
     'ROLE_GD_ADMIN_BACKEND_USER_DELETE', 
     'ROLE_GD_ADMIN_BACKEND_USER_OPERATOR', 
     'ROLE_GD_ADMIN_BACKEND_USER_MASTER', 

Когда я вхожу в мой админ/приборную панель Я могу видеть BackendUser в виджетах панели администратора. Но когда я нажимаю на «Список» или «Добавить новый», я получаю исключение 403: «Отказано в доступе».

Куда я иду не так?

Спасибо, Amit

ответ

0

Я не думаю, что вы должны возиться с классом BaseUser от расслоения пользователя соната.

Вместо этого вы можете создать новую админу crud в своем собственном пакете на основе пользователя admin crud (Sonata \ UserBundle \ Admin \ Document \ UserAdmin) и расширить его с помощью метода prePersist(), чтобы установить isAdmin в true:

public function prePersist($object) 
{ 
    $object->setIsAdmin(true); 
} 

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

+0

umm ... извините, что отсутствовала одетая опечатка. Я поместил содержимое UserAdmin.php в свой GDAdmin/BackendUserAdmin.php. PrePersist не будет работать, потому что событие также вызывается, когда пользователь создается из интерфейса сайта. Поэтому я вручную устанавливаю флаг в true в BackendUserAdminController. – Amit

+0

Проблема заключается в передаче моего идентификатора сервиса - gd_admin.backend_user. Если я заменил «sonata.user.admin.user» на «gd_admin.backend_user» в файле /Resources /Config/admin_orm.xml пакета, все работает отлично. Я хочу знать, как мне передать этот идентификатор службы? – Amit