symfony sfGuardUser在更新后有更高版本

时间:2010-09-21 12:21:05

标签: symfony1 sfguard

我正在使用symfony 1.4和sfGuardDoctrinePlugin,我已经安装并安装好了但是我遇到了以下问题:

如果我以管理员身份登录并更新用户的权限,则该用户必须先退出,然后再次登录才能获得新添加的凭据/权限。

有解决方法吗?

我不确定修复会有多容易。当用户登录时,我认为他们的凭据会在那里添加到他们的会话属性中。因此,当管理员更新其凭据时,其会话仍保留旧凭据。这意味着对hasCredential的任何调用都不是“实时”。

由于

3 个答案:

答案 0 :(得分:2)

这会为您的应用程序的每个请求添加额外的查询。您可以通过$user->getSfGuardUser()->refresh(true)强制更新凭据,这将重新加载实体及其所有关系(以及它的权限)。

答案 1 :(得分:1)

感谢您的回答,我修改了sfGuardUser模块的操作类的processForm函数。

如果我登录并更改自己的权限,则会在那里更新会话。

我的问题是,如果我编辑其他用户的用户权限,我需要编辑他们的会话数据。为了解决这个问题,我启用了数据库会话,所以我现在有会话保存而不是文件。所以我的下一个问题是如何为其他用户隔离会话。

会话数据库包含以下列:sess_id,sess_data,sess_time。

sess_data已序列化,这就是我需要更新的内容。

但我认为symfony会经常更新会话ID,并且很难始终为其他用户隔离正确的会话。

我认为尝试反序列化也很慢,检查user_id然后重新序列化数据。我想我需要一个user_id列。

答案 2 :(得分:0)

我知道这是一个老问题,但我最近遇到了同样的问题,它花了我更长的时间来找到答案(在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;
    }