【发布时间】:2013-05-10 22:05:47
【问题描述】:
我有一种情况,我需要允许当前登录的用户在 cakephp 中更改他的用户名。 当我更新数据库中的用户名时,它不会反映在
$this->Auth->user('username')
即使在更改数据库 $this->Auth->user('username') 中的记录后,仍会提供相同的旧用户名,因为它保存在当前会话中。
谁能帮我更新当前的 $this->Auth 会话数据
提前致谢
【问题讨论】:
我有一种情况,我需要允许当前登录的用户在 cakephp 中更改他的用户名。 当我更新数据库中的用户名时,它不会反映在
$this->Auth->user('username')
即使在更改数据库 $this->Auth->user('username') 中的记录后,仍会提供相同的旧用户名,因为它保存在当前会话中。
谁能帮我更新当前的 $this->Auth 会话数据
提前致谢
【问题讨论】:
AuthComponent 在登录时将用户的属性存储在会话中。更新数据库中的用户数据不会自动更新会话中的这些更改,因此您必须在成功将更改保存到数据库后自己执行此操作;
虽然用户已经登录,但手动登录用户,也会更新 Session 内部的数据(查看源代码:https://github.com/cakephp/cakephp/blob/master/lib/Cake/Controller/Component/AuthComponent.php#L543)
类似的东西;
if ($this->User->save($this->request->data)) {
// Succesfully update the user
// update the users data inside the session
$this->Auth->login($this->request->data);
// and redirect somewhere else
return $this->redirect(array('controller' => 'pages', 'action' => 'display', 'home'));
}
虽然您可以通过会话组件更新会话数据来实现相同的目的,但通过 AuthComponent 执行此操作更容易,因为它会自动将数据存储在会话内的正确位置:)
另见:Identifying users and logging them in
注意因为你没有提到你使用的是什么版本的 CakePHP,我假设 CakePHP 2.x
【讨论】:
AuthComponent::$sessionKey 在会话中获取正确的“密钥”
更新数据库中的新名称后,您只需更新会话中的名称,如下所示:
$this->Session->write('Auth.User.name', $new_username);
这行代码将在同一会话中更新用户名。
【讨论】:
您只需更改用户名的会话数据
$this->Session->write('Auth.User.username') = $newusername;
例如
$this->Session->write('Auth.User.username') = $this->request->data['User']['username'];
【讨论】: