#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
метод. Есть идеи / помощь?