Session 在CakePHP上更新特定用户的会话
我有一个例子,管理员可以编辑一些用户信息,这些信息可能属于登录用户。我需要确保其他用户的身份验证信息更新以反映新的更改。目前看来,除非手动更新,否则身份验证信息是静态的。有没有一种方法可以手动更新身份验证信息(本质上是会话),不是当前用户的身份验证信息,而是已知用户的身份验证信息?我认为这在CakePHP库中是不可能的,因为它看起来像一个非常特殊的用例。你可以采取的方法是-Session 在CakePHP上更新特定用户的会话,session,cakephp,Session,Cakephp,我有一个例子,管理员可以编辑一些用户信息,这些信息可能属于登录用户。我需要确保其他用户的身份验证信息更新以反映新的更改。目前看来,除非手动更新,否则身份验证信息是静态的。有没有一种方法可以手动更新身份验证信息(本质上是会话),不是当前用户的身份验证信息,而是已知用户的身份验证信息?我认为这在CakePHP库中是不可能的,因为它看起来像一个非常特殊的用例。你可以采取的方法是- 在用户表中放置一个标志,并在更新详细信息后切换它。对于使用AppController的beforeFilter的每个请求,
从外部更新用户会话通常不是首选机制,这被认为是一种黑客行为,请尝试考虑任何可能的解决方法。不确定您的具体用例是什么,但我同意在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表。但想法是一样的。