symfony sfGuardUser hasCrendential live после обновления - PullRequest
3 голосов
/ 21 сентября 2010

Я использую symfony 1.4 и sfGuardDoctrinePlugin, я установил его и настроил нормально, но у меня возникает следующая проблема:

Если я войду в систему как администратор и обновлю разрешения для пользователя, этопользователь должен выйти из системы, а затем снова войти в систему, прежде чем получить новые добавленные учетные данные / разрешения.

Есть ли способ обойти это?

Я не уверен, насколько легко это исправить.Когда пользователь входит в систему, я думаю, что его учетные данные тут же добавляются к его атрибутам сеанса.Поэтому, когда администратор обновляет свои учетные данные, их сеанс все еще содержит старые учетные данные.Это означает, что любой вызов hasCredential не является «живым».

Спасибо

Ответы [ 3 ]

2 голосов
/ 21 сентября 2010

Это добавит дополнительные запросы к каждому запросу вашего приложения. Вы можете принудительно обновить учетные данные с помощью $user->getSfGuardUser()->refresh(true), что перезагрузит сущность и все ее отношения (и, следовательно, ее разрешения).

1 голос
/ 22 сентября 2010

Спасибо за ваш ответ, я изменил функцию processForm класса действий модуля sfGuardUser.

Если я войду и изменю свои собственные разрешения, сеанс будет обновлен тут же.

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

База данных сеансов имеет следующие столбцы: sess_id, sess_data, sess_time.

sess_data сериализуется, и это то, что мне нужно обновить.

Но я думаю, что Symfony обновляет идентификаторы сеансов довольно часто, и было бы трудно всегда изолировать правильный сеанс для другого пользователя.

Я думаю, что попытка десериализации будет слишком медленной, проверьте user_id, а затем повторно выполните сериализацию данных. Мне нужен столбец user_id, я думаю.

0 голосов
/ 24 февраля 2012

Я знаю, что это старый вопрос, но недавно у меня была такая же проблема, и мне потребовалось гораздо больше времени, чем нужно, чтобы найти ответ (который был опубликован в разделе кода Symfony). Вставьте эту функцию в свой класс myUser, и все проблемы исчезнут:

/**
   * Overridden method that actually reads the permission from DB
   * instead of relying on data present when the user logs in.
   *
   * @param  string  permission name
   *
   * @return boolean true if the user has credential
   */
  public function hasCredential($permission_name)
  {
    if (!$this->isAuthenticated()) {
      return false;
    }
    $gu = $this->getGuardUser();
    $groups = $gu->getGroups();
    $permissions = $gu->getPermissions();

    $permission_names = array();
    foreach($permissions as $permission) {
      $permission_names[] = $permission->getName();
    }
    foreach($groups as $group) {
      $group_permissions = $group->getPermissions();
      foreach($group_permissions as $group_permission) {
        $permission_names = array_merge($permission_names, array($group_permission->getName()));
      }
    }
    $permission_names = array_unique($permission_names);
    return (in_array($permission_name, $permission_names)) ? true : false;
    }
...