2015-08-23 4 views
1

Я делаю свое собственное приложение для входа в Symfony2, и я новичок в Symfony. Я знаю, что у меня есть FOSUserBundle в моем распоряжении, но я сначала пытаюсь изучить безопасность.Symfony 2 Данные сущности доступа для формы

Управление доступом определяет 3 роли: ROLE_SUPER_ADMIN, ROLE_ADMIN и ROLE_USER. В дополнение к этому определенные роли имеют другие роли, связанные с ними, такие как ROLE_ADMIN_VIEW_USERS

Я НЕ с использованием security.context service на entity.roles, чтобы отобразить мои роли от лица, потому что я только хочу, чтобы осуществить ROLE_ADMIN и ROLE_USER. При регистрации каждому пользователю предоставляется роль ROLE_USER. Когда пользователь с ROLE_SUPER_ADMIN просматривает страницу редактирования для пользователя или администратора, я пытаюсь установить флажок «Сделать этого пользователя администратором». Если они уже имеют ROLE_ADMIN в объекте getRoles, поле будет проверено.

Если флажок Я делаю это в действии

if ($editForm->isValid()) { 
      $role = ('ROLE_ADMIN' === $editForm->get('role')->getViewData()) 
        ? "ROLE_ADMIN" 
        : "ROLE_USER"; 
      $entity->setRoles(array($role)); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('admin_new_edit', array('id' => $id))); 
     } 

Так что мой вопрос: Как проверить коробку, если в getRoles сущностей() является ROLE_ADMIN? Помните, как указано выше, роли отображаются в объекте, но роль не является. Я не хочу использовать роли из сопоставленного объекта, потому что из службы безопасности есть несколько значений, которые я не хочу использовать.

$builder 
     ->add('username', 'text') 
     ->add('password', 'password') 
     ->add('email', 'email') 
     ->add('role', 'choice', array(
      'mapped' => false, 
      'label' => 'Make Admin', 
      'value' => 'ROLE_ADMIN', 
      'required' => false, 
      //show following attribute only if entity getRoles is ROLE_ADMIN 
      //how do i get the value from the entity? 
      'attr' => array('checked'=>'checked'), 
      )) 
+0

Таким образом, проблема, с которой вы сталкиваетесь, заключается в определении того, имеет ли объект редактирования в настоящее время редактируемый объект 'User' набор' ROLE_ADMIN' (с использованием 'User.getRoles()'), поэтому флажок установлен по умолчанию для проверки или проверки? –

+0

да @JaredFarrish это правильно. –

+1

И проблема в 'User.getRoles()' даст вам что-то вроде '{" role ": [" ROLE_USER "," ROLE_SUPER_ADMIN "," ROLE_ADMIN "]}' взамен? Таким образом, необработанный возврат 'getRoles()' не говорит вам, установлен ли параметр ROLE_ADMIN, потому что на самом деле он дает вам строку JSON всех ролей? Почему бы вам не добавить метод 'User.isAdmin()', который дает вам эту информацию, получая данные из 'User.getRoles()', читая его и проверяя роли 'ROLE_SUPER_ADMIN' или' ROLE_ADMIN' в список? –

ответ

0

Мое предложение было бы что-то вроде этого:

->add('role', 'choice', array(
      'mapped' => true, 
      'label' => 'Make Admin', 
      'multiple' => true, 
      'expanded' => true, 
      'choices' => array('ROLE_ADMIN' => 'Yes') 
      'required' => false, 
      )) 

Значение должно быть автоматически берется из объекта, если он имеет свойство «роли», так же, как и для других полей. Вы также можете добавить другие роли в массив выбора, и вы получите флажок для каждого из них.

Я не тестировал его, но надеюсь, что он работает.

+0

** Роль ** не отображается в базе данных, отображается ** ролей **. В addtition он сопоставляется с json_array для уровня безопасности. Я не могу использовать роли, потому что список сопоставленных ролей намного больше, чем я хочу. В formtype я хочу получить значение, хранящееся в базе данных/сущности под getRoles, и установить флажок, если возврат из getRoles равен ROLE_ADMIN –

+2

Хорошо, я вижу. Возможно, эта статья поможет вам: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-underlying-data – LorenzSchaef