symfony — sfDoctrineGuard — ограничение создания пользователя на основе учетных данных группы

#symfony1 #symfony-1.4

#symfony1 #symfony-1.4

Вопрос:

В настоящее время я нахожусь в процессе разработки довольно большой и сложной системы управления пользователями с использованием sfDoctrineGuard

Я создал 4 группы, editors , moderators admins и superadmins .

Что я хочу сделать, это ограничить определенных пользователей в admin, чтобы они могли создавать / просматривать / редактировать других пользователей в модуле администратора sfGuardUser.

Так, например, superadmins пользователь может создавать editors , moderators , admins и другие superadmins , но moderator может только создавать editors .

Возможно ли это в sfDoctrineGuard, если да, может ли кто-нибудь дать мне представление о том, как я этого добьюсь?

Спасибо

Ответ №1:

Прежде всего, вы можете установить учетные данные в генераторе.yml для отображения / скрытия ссылок на действия и объектных действий на основе учетных данных. Например:

 config:
  list:
    object_actions:
      _delete:
        confirm: Вы уверены, что хотите удалить пользователя?
        credentials: superuser
    actions:
      _new:
        credentails: moderator
  

Затем настройте свои формы с помощью пользовательских табличных методов для виджетов doctrine choice групп:

 class sfGuardUserForm extends PluginsfGuardUserForm
{
  public function configure()
  {
    //groups_list
    $this->getWidget('groups_list')->setOption('expanded', true);
    $this->getWidget('groups_list')->setOption('table_method', 'getListForAdmin');
    $this->getValidator('groups_list')->setOption('query', Doctrine::getTable('sfGuardGroup')->getListForAdmin());
  }
}

class sfGuardGroupTable extends PluginsfGuardGroupTable
{
  /**
   * Builds list query based on credentials
   *
   */
  public function getListForAdmin()
  {
    $user = sfContext::getInstance()->getUser();

    $q = $this->createQuery('g');

    if (!$user->isSuperAdmin() amp;amp; $user->hasCredential('moderator'))
    {
      $q->addWhere('g.name IN (?)', array('editor'));
    }
    else if ($user->hasCredential('editor'))
    {
      $q->addWhere('g.name IN (?)', array('editor'));
    }        
    return $q;
  }
}
  

Пара улучшений: избавьтесь от однотонального вызова, передав экземпляр пользователя из action (в preExecute) и загрузите имена групп из app.yml с sfConfig::get вместо жесткого кодирования в нем в коде.

Комментарии:

1. Если я войду в систему как модератор, буду ли я по-прежнему видеть всех пользователей или только модераторов и редакторов в списке?

2. Вы можете создать пользовательский список пользователей на основе учетных данных с тем же подходом. Создайте метод sfGuardUserTable::getForList и укажите его в generator.yml > list > table_method.

3. Хорошо, но это будет вызвано независимо от того, под именем какого пользователя я вошел в систему. У меня есть 4 группы пользователей, скажем, по 2 пользователя в каждой группе. Суперпользователь может видеть всех пользователей. Но модератор должен иметь возможность видеть только модераторов и редакторов, а редактор должен иметь возможность видеть только других редакторов.

4. Нет, это будет вызвано в зависимости от того, какой пользователь входит в систему, будьте уверены. Посмотрите на строку: «$user = sfContext::getInstance()->getUser(); «. Здесь вы получаете экземпляр вошедшего в систему пользователя. Хотя это не лучшая практика.

5. @Dziamid Я пробовал ваш код выше, но я не могу заставить его работать. Я вошел в систему с базовой учетной записью, то есть у меня есть права редактора, но я все еще могу видеть всех пользователей и все группы. Похоже, что это не вызывает getListForAdmin метод. Есть идеи / помощь?