Имеет ли смысл использовать архитектуру sfguard для этой цели?
Абсолютно, но вам нужно немного исправить это. По умолчанию Symfony хранит учетные данные в сеансе, что означает, что они не будут признаны недействительными до истечения срока действия вашей сессии. Это большая проблема, когда вы ожидаете немедленного эффекта, добавив кого-то в группу или предоставив им разрешение.
Чтобы исправить это, вы хотите, чтобы выполнить одно из следующих действий:.
- нагрузки учетных данных при каждом запросе, а не на знак в
- При изменении учетных данных пользователя, аннулируют их либо через глобальную настройку кеша в APC (вы используете APC, правильно?) или настройку в профиле пользователя.
В любом случае вам нужно будет познакомиться с пользовательской системой Symfony и sfGuardDoctrine. Взгляните на sfGuardSecurityUser::signIn
, чтобы вы знали, как работают учетные данные по умолчанию.
Как проверить, имеет ли конкретный пользователь специальное разрешение для определенной группы?
Tristan покрыл это довольно тщательно. Вы также захотите взглянуть на sfDoctrineGuard readme. Обратите внимание, что для любого решения, в котором изменения учетных данных происходят вживую для подписанных пользователей, вам необходимо переопределить большинство, если не все методы, перечисленные в Tristan, для выполнения какой-либо недействительности.
Кроме того, проверьте this related question, это может быть полезно.
Спасибо. У меня все еще не было ничего: как я могу проверить разрешение на определенную группу? например, пользователь A имеет тип разрешения B в группе C. – Yos
if ($ this-> getUser() -> hasCredential ('B') && $ this-> getUser() -> hasGroup ('C')) –
Да , но что, если пользователь является администратором в сообществе C, но обычный пользователь в сообществе D? в вашем коде нет такого условия, как «пользователь A имеет учетные данные B в группе C». – Yos