symfony - sfDoctrineGuard - ограничение создания пользователей на основе учетных данных группы - PullRequest
0 голосов
/ 20 апреля 2011

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

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

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

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

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

Спасибо

1 Ответ

0 голосов
/ 20 апреля 2011

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

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

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

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() && $user->hasCredential('moderator'))
    {
      $q->addWhere('g.name IN (?)', array('editor'));
    }
    else if ($user->hasCredential('editor'))
    {
      $q->addWhere('g.name IN (?)', array('editor'));
    }        
    return $q;
  }
}

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

...