【问题标题】:symfony sfGuardUser hasCrendential live after updatesymfony sfGuardUser hasCrendential live after update
【发布时间】:2011-04-15 04:23:48
【问题描述】:

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

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

有没有办法解决这个问题?

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

谢谢

【问题讨论】:

    标签: symfony1 sfguard


    【解决方案1】:

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

    【讨论】:

    • 您可以通过仅对每 10 个页面加载中的一个执行此操作来减少影响: if (1 == rand(1,10)) { $user->getSfGuardUser()->刷新(真); } 这将显着减少影响。结果将是凭据更改和更新权限之间的短暂延迟,但无需注销。
    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我知道这是一个老问题,但我最近遇到了同样的问题,我花了比它应该找到答案的时间更长的时间(发布在 Symfony 的代码 sn-p 部分)。将此函数粘贴到您的 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;
          }
      

      【讨论】:

      • 为什么不在你的操作 preExecute() 方法中调用sfContext::getInstance()->getUser->getGuardUser()->refresh(true)?我也遇到了这个问题,想知道你在自己解决之前碰到了什么墙。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多