расширенные / динамические разрешения на sfguard - symfony - PullRequest
1 голос
/ 18 ноября 2010

У меня есть проект Symfony, и я хочу добавить функцию сообщества.

Каждый может открыть сообщество в качестве администратора и пригласить людей присоединиться к сообществу.

Администратор имеет больше разрешений, чем администратор.обычный пользователь сообщества.

Дело в том, что я хочу использовать sfguarduser, sfguardgroup, sfguardpermission Syfony

  1. Имеет ли смысл использовать для этой цели архитектуру sfguard?
  2. как проверить, есть ли у конкретного пользователя специальные права на определенную группу?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Эй, это тебе немного поможет;)

Внутри действия:

  class myAccountActions extends sfActions
{
  public function executeDoThingsWithCredentials()
  {
    $user = $this->getUser();

    // Check if the user has a credential
    echo $user->hasCredential('foo');                      =>   true

    // Check if the user has both credentials
    echo $user->hasCredential(array('foo', 'bar'));        =>   true

    // Check if the user has one of the credentials
    echo $user->hasCredential(array('foo', 'bar'), false); =>   true

    // Remove a credential
    $user->removeCredential('foo');
    echo $user->hasCredential('foo');                      =>   false

    // Remove all credentials (useful in the logout process)
    $user->clearCredentials();
    echo $user->hasCredential('bar');                      =>   false
  }
}

Внутри слоя:

     <?php if ($sf_user->hasCredential('section3')): ?>
  ....
  <?php endif; ?>

Вы можете рассмотреть возможность использования дополнительно:

if($user->hasGroup('SOME_GROUP')) 

Источник: Symfony внутри слоя

2 голосов
/ 19 ноября 2010

Имеет ли смысл использовать для этой цели архитектуру sfguard?

Абсолютно, но вам нужно немного ее исправить.По умолчанию Symfony хранит учетные данные в сеансе, что означает, что они не будут признаны недействительными, пока не истечет срок вашего сеанса.Это большая проблема, когда вы ожидаете увидеть немедленный эффект, добавив кого-либо в группу или предоставив ему разрешение.

Чтобы исправить это, вам нужно выполнить одно из следующих действий:

  • Загружать учетные данные при каждом запросе, а не при входе в систему.
  • При изменении учетных данных пользователя их можно сделать недействительными либо через глобальную настройку кэша в APC (верно, вы используете APC?) Илинастройка в профиле пользователя.

В любом случае вам придется ознакомиться с Symfony и пользовательской системой sfGuardDoctrine.Посмотрите на sfGuardSecurityUser::signIn, чтобы вы знали, как по умолчанию работают учетные данные.

Как проверить, есть ли у конкретного пользователя специальные полномочия для определенной группы?

Тристан довольно подробно это осветил.Вы также можете захотеть взглянуть на sfDoctrineGuard readme .Обратите внимание, что для любого решения, в котором изменения учетных данных происходят в реальном времени для вошедшего в систему пользователя, вам необходимо переопределить большинство, если не все методы, перечисленные Tristan, для выполнения какого-либо рода аннулирования.

Кроме того, проверьте этот связанный вопрос , это может быть полезно.

...