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

时间:2014-08-12 16:16:45

标签: session cakephp

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

3 个答案:

答案 0 :(得分:2)

感谢Mark Story的投入,最简单的方法似乎如下:

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保存到user_id列。通过创建名为cake_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;
    }
}

然后根据user_id简单地删除所需的会话变得微不足道。

答案 1 :(得分:0)

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

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

  2. 如果要将会话数据存储在数据库中,您可以从那里更新它(或删除它以强制用户登录)。我不确定cakephp如何将它存储在数据库中。否则,如果你找到会话数据的文件,你可以浏览它们以获得你想要更新的用户ID。

  3. 从外部更新用户会话通常不是首选机制,并且被认为是黑客,尝试考虑任何可能的解决方法。

答案 2 :(得分:0)

不确定您的确切用例是什么,但我同意在AppController中使用beforeFilter来检查标志。可能不希望在每次检查页面时查询数据库,这可能不是您需要考虑的问题,但如果是,您可以查看CakePHP的缓存。在Config / bootstap.php中,您可以设置其他缓存并根据用户的ID键入它们,然后在模型中,您可以将逻辑放在beforeSave()或afterSave()中以清除用户缓存文件。然后,AppController中的beforeFilter可以检查缓存文件,如果它丢失,您就知道需要构建一个新的缓存文件并将该数据提取到会话中。我在CakePHP中使用这些行来进行ACL缓存。我为每个用户构建了一个缓存,并将其权限加载到Session中,如果ACL权限更改,则重建缓存。

http://book.cakephp.org/2.0/en/core-libraries/caching.html