Расширенные / динамические разрешения на sfguard - symfony

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

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

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

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

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

2 ответа

Решение

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

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

  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 внутри слоя

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

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

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

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

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

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

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

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

Другие вопросы по тегам