2010-11-18 3 views
1

У меня есть проект symfony и вы хотите добавить функцию сообщества.расширенные/динамические разрешения на sfguard - symfony

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

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

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

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

ответ

3

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

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

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 inside the layer

+0

Спасибо. У меня все еще не было ничего: как я могу проверить разрешение на определенную группу? например, пользователь A имеет тип разрешения B в группе C. – Yos

+0

if ($ this-> getUser() -> hasCredential ('B') && $ this-> getUser() -> hasGroup ('C')) –

+0

Да , но что, если пользователь является администратором в сообществе C, но обычный пользователь в сообществе D? в вашем коде нет такого условия, как «пользователь A имеет учетные данные B в группе C». – Yos

2

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

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

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

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

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

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

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

Кроме того, проверьте this related question, это может быть полезно.

Смежные вопросы