3

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

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

有没有解决的办法?

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

谢谢

4

3 回答 3

2

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

于 2010-09-21T12:25:37.603 回答
1

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

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

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

会话数据库具有以下列:sess_id、sess_data、sess_time。

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

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

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

于 2010-09-22T12:26:12.717 回答
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;
    }
于 2012-02-23T21:49:02.317 回答