Session 在CakePHP上更新特定用户的会话

Session 在CakePHP上更新特定用户的会话,session,cakephp,Session,Cakephp,我有一个例子,管理员可以编辑一些用户信息,这些信息可能属于登录用户。我需要确保其他用户的身份验证信息更新以反映新的更改。目前看来,除非手动更新,否则身份验证信息是静态的。有没有一种方法可以手动更新身份验证信息(本质上是会话),不是当前用户的身份验证信息,而是已知用户的身份验证信息?我认为这在CakePHP库中是不可能的,因为它看起来像一个非常特殊的用例。你可以采取的方法是- 在用户表中放置一个标志,并在更新详细信息后切换它。对于使用AppController的beforeFilter的每个请求,

我有一个例子,管理员可以编辑一些用户信息,这些信息可能属于登录用户。我需要确保其他用户的身份验证信息更新以反映新的更改。目前看来,除非手动更新,否则身份验证信息是静态的。有没有一种方法可以手动更新身份验证信息(本质上是会话),不是当前用户的身份验证信息,而是已知用户的身份验证信息?

我认为这在CakePHP库中是不可能的,因为它看起来像一个非常特殊的用例。你可以采取的方法是-

  • 在用户表中放置一个标志,并在更新详细信息后切换它。对于使用AppController的beforeFilter的每个请求,只需为该用户检查该标志并重新生成会话数据

  • 如果将会话数据存储在数据库中,则可以从数据库中更新会话数据(或删除会话数据以强制用户登录)。我不确定cakephp如何将其存储在数据库中。否则,如果要查找会话数据文件,可以在其中扫描要更新的用户id


  • 从外部更新用户会话通常不是首选机制,这被认为是一种黑客行为,请尝试考虑任何可能的解决方法。

    不确定您的具体用例是什么,但我同意在AppController中使用beforeFilter来检查标志。可能不希望在每次页面加载时都查询数据库以进行此检查,这在您的情况下可能不是一个问题,但如果是这样,您可以查看CakePHP的缓存。在Config/bootstap.php中,您可以设置其他缓存并根据用户的id对其进行键控,然后在模型中,您可以在beforeSave()或afterSave()中放置逻辑以清除该用户缓存文件。然后AppController中的beforeFilter可以检查缓存文件,如果缺少该文件,您就知道需要构建一个新的缓存文件并将该数据拉入会话。我在CakePHP中使用了类似于这些内容的ACL缓存。我为每个用户构建一个缓存,并将其权限加载到会话中,如果ACL权限发生更改,则重新构建缓存


    得益于Mark Story的输入,最简单的方法似乎是:

    <?php 
        class cake_sessions extends AppModel{
        public function beforeSave($options = array()){
            if ( AuthComponent::user() ) {
                $this->data[$this->alias]['user_id'] = CakeSession::read('Auth.User.id');
            }
            return true;
        }
    }
    
    1) 确保您正在使用数据库会话

    Configure::write('Session', array(
        'defaults' => 'database',
        'handler' => array(
            'model' => 'cake_sessions'
        ),
    ));
    
    …类似以下的模式可以正常工作:

    CREATE TABLE `cake_sessions` (
        `user_id` int(11) NOT NULL,
        `id` varchar(255) NOT NULL DEFAULT '',
        `data` text,
        `expires` int(11) DEFAULT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    2) 将用户id保存到
    用户id
    列。通过创建一个名为
    cake\u sessions.php
    的文件,并将其保存在
    Model
    目录中,可以实现这一点。该文件应包含以下内容:

    <?php 
        class cake_sessions extends AppModel{
        public function beforeSave($options = array()){
            if ( AuthComponent::user() ) {
                $this->data[$this->alias]['user_id'] = CakeSession::read('Auth.User.id');
            }
            return true;
        }
    }
    

    “可能不希望在每次加载页面时都查询数据库以进行此检查。”这是我不情愿的做法。就我而言,有些运动员属于团队。来自一个团队的教练可能会将一名运动员添加到他们的团队中,如果一名运动员在这种情况下登录,我需要确保他们的身份验证数据是最新的检查确实没有办法,但是使用cake的缓存应该会提高性能。在这种情况下,您将检查丢失的缓存文件,如果它丢失,则构建一个新的缓存文件。当教练对运动员进行更新时,它将被删除。查看模型回调方法,因为这是清除缓存的最佳位置。或者使用一个用于此目的的方法-使用此方法,您还可以保存更多的元数据,而不需要弄乱默认的cake_sessions表。但想法是一样的。