我有一个案例,管理员可以编辑一些用户信息,这些信息可能属于登录用户。我需要确保其他用户的身份验证信息更新以反映新的更改。目前看来,除非手动更新,否则Auth信息是静态的。有没有办法手动更新Auth信息(主要是会话),而不是当前用户,而是已知用户?
答案 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库可以直接使用它,因为它看起来像一个非常特殊的用例。你可以采取的方法是 -
在用户表中放置一个标志,并在更新详细信息后将其切换,对于使用AppController的beforeFilter的每个请求,只需为该用户检查此标志并重新生成会话数据。
如果要将会话数据存储在数据库中,您可以从那里更新它(或删除它以强制用户登录)。我不确定cakephp如何将它存储在数据库中。否则,如果你找到会话数据的文件,你可以浏览它们以获得你想要更新的用户ID。
从外部更新用户会话通常不是首选机制,并且被认为是黑客,尝试考虑任何可能的解决方法。
答案 2 :(得分:0)
不确定您的确切用例是什么,但我同意在AppController中使用beforeFilter来检查标志。可能不希望在每次检查页面时查询数据库,这可能不是您需要考虑的问题,但如果是,您可以查看CakePHP的缓存。在Config / bootstap.php中,您可以设置其他缓存并根据用户的ID键入它们,然后在模型中,您可以将逻辑放在beforeSave()或afterSave()中以清除用户缓存文件。然后,AppController中的beforeFilter可以检查缓存文件,如果它丢失,您就知道需要构建一个新的缓存文件并将该数据提取到会话中。我在CakePHP中使用这些行来进行ACL缓存。我为每个用户构建了一个缓存,并将其权限加载到Session中,如果ACL权限更改,则重建缓存。