在 cakephp 中编辑用户配置文件后如何更改身份验证用户名

Posted

技术标签:

【中文标题】在 cakephp 中编辑用户配置文件后如何更改身份验证用户名【英文标题】:how to change auth username after user profile edit in cakephp 【发布时间】:2013-05-10 22:05:47 【问题描述】:

我有一种情况,我需要允许当前登录的用户在 cakephp 中更改他的用户名。 当我更新数据库中的用户名时,它不会反映在

 $this->Auth->user('username')

即使在更改数据库 $this->Auth->user('username') 中的记录后,仍会提供相同的旧用户名,因为它保存在当前会话中。

谁能帮我更新当前的 $this->Auth 会话数据

提前致谢

【问题讨论】:

【参考方案1】:

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

【讨论】:

正确的解决方案@theJeztah.. 很棒 @liyakat 谢谢!我认为这将是比手动更新会话更清洁的解决方案,因为这将涉及通过AuthComponent::$sessionKey 在会话中获取正确的“密钥” 这种方法的问题可能是,如documentation,或者您的源链接说,如果您将参数传递给登录函数,“该数据将存储为登录用户" - 这意味着只有请求中的值将存储在会话中,而不是完整的用户信息,因为 cake 在登录期间通常从数据库中获取它【参考方案2】:

更新数据库中的新名称后,您只需更新会话中的名称,如下所示:

$this->Session->write('Auth.User.name', $new_username);

这行代码将在同一会话中更新用户名。

【讨论】:

【参考方案3】:

您只需更改用户名的会话数据

$this->Session->write('Auth.User.username') = $newusername;

例如

 $this->Session->write('Auth.User.username') = $this->request->data['User']['username'];

【讨论】:

以上是关于在 cakephp 中编辑用户配置文件后如何更改身份验证用户名的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp:选择登录后要保存的数据

CakePHP - 如何在更改语言和重新加载路由表后翻译当前 URL

CakePHP hasOne belongsTo 关系,编辑/添加相同动作

在 cakephp view fly (.ctp) 上更改,但在浏览器中没有更改

如何在 CakePHP 2 中只编辑自己的数据?

如何在根域的子文件夹中运行 CakePHP 应用程序?